零基础学算法第四章

4.1 排序概述

详情见:https://blog.csdn.net/m0_38072739/article/details/84720932(转载)

4.2 冒泡排序

基本思想:

将n个记录看作按纵向排列,每趟排序时自下至上对每对相邻记录进行比较,若次序不符合要求(逆序)就交换。每 趟排序结束时都能使排序范围内关键字最小的记录象一个气泡一样升到表上端的对应位置,整个排序过程共进行n-1趟,依次将关键字最小、次小、第三小…的各 个记录“冒到”表的第一个、第二个、第三个…位置上。

#include<stdlib.h>
#include<time.h>

int CreateData(int arr[],int n,int min,int max)  //创建一个随机数组,arr保存生成的数据
{
	int i,j,flag;
	srand(time(NULL));
	if((max-min+1)<n)  return 0;   //最大数与最小数之差小于产生数组的数量,生成数据不成功
	for(i=0;i<n;i++)
	{
		do
		{
			arr[i]=(max-min+1)*rand()/(RAND_MAX+1)+min;  //从min值开始,生成[min,max)的随机整数
			flag=0;
			for(j=0;j<i;j++)
			{
				if(arr[i]==arr[j])
					flag=1;
			}
		}while(flag);   //相等,则重新生成
	}
	return 1;
}




#include<stdio.h>
#include"CreateData.c"
#define ARRAYLEN 6
void BubbleSort(int a[],int n)
{
	int i,j,t;
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(a[j-1]>a[j])
			{
				t=a[j-1];
				a[j-1]=a[j];
				a[j]=t;
			}
		}
		printf("第%2d遍:",i+1);
		for(j=0;j<n;j++)
			printf("%d ",a[j]);
		printf("\n");
	}
}
void BubbleSort1(int a[],int n)
{
	int i,j,t,flag=0;  //flag用来标记是否发生交换
	for(i=0;i<n-1;i++)
	{
		for(j=n-1;j>i;j--)
		{
			if(a[j-1]>a[j])       //交换数据
			{
				t=a[j-1];
				a[j-1]=a[j];
				a[j]=t;
				flag=1;
			}
		}
		if(flag==0) //没发生交换,直接跳出循环
			break;
		else       //进行下一遍的设置
			flag=0;
		printf("第%2d遍:",i+1);
		for(j=0;j<n;j++)
			printf("%d ",a[j]);
		printf("\n");
	}
}
int main()
{
	int i,a[ARRAYLEN];
	for(i=0;i<ARRAYLEN;i++)
		a[i]=0;
	if(!CreateData(a,ARRAYLEN,1,100))
	{
		printf("生成随机数不成功!\n");
		getchar();
		return 1;
	}
	printf("原数据:");
	for(i=0;i<ARRAYLEN;i++)
		printf("%d ",a[i]);
	printf("\n");
	BubbleSort1(a,ARRAYLEN);
	printf("排序后:");
	for(i=0;i<ARRAYLEN;i++)
		printf("%d ",a[i]);
	printf("\n");
	getchar();
	return 0;
}

4.4 简单选择排序

算法基本思想:第一趟,从n个记录当真找出 关键字最小的记录与第一个记录交换;第二趟,从第二个记录开始的n-1个记录中找出关键字最小的记录与第二个记录交换;依次类推,直到整个序列按照关键字有序。

在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。我们可以通过设置一个变量min,每一次比较仅存储较小元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小元素的下标,此时再执行交换操作即可。

代码:

#include<stdio.h>
#include"CreateData.cpp"
#define ARRAYLEN 10

void SelectSort(int a[],int n)
{
	int i,j,t,k;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
			if(a[k]>a[j])  k=j;
		t=a[i];
		a[i]=a[k];
		a[k]=t;
	}
}

int main(){
	int i,a[ARRAYLEN];
	for(i=0;i<ARRAYLEN;i++)
		a[i]=0;
	if(!(CreateData(a,ARRAYLEN,1,100)))
	{
		printf("生成随机数不成功!\n");
		getchar();
		return 1;
	}

	printf("原数据:");
	for(i=0;i<ARRAYLEN;i++)
		printf("%d ",a[i]);
	printf("\n");
	SelectSort(a,ARRAYLEN);
	printf("排序后:");
	for(i=0;i<ARRAYLEN;i++)
		printf("%d ",a[i]);
	printf("\n");
	getchar();
	return 0;
}
发布了33 篇原创文章 · 获赞 1 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/futurech/article/details/88418331