八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度

#include
#include
#include 

const int maxx=20010;
int a[11][maxx];

void swap(int *x,int *y)
{
	int z=*x;
	*x=*y;
	*y=z;
}
/*--------------插入排序--------------*/ 
void zjcrsort()//直接插入排序
{
	int b[11][maxx];
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
	for(int k=0;k<10;k++)
	{
		int begin=clock(); 
		int cnt1=0,cnt2=0;//比较次数和移动次数
		for(int i=1;i<20000;i++)
		{
			int j=i;
			int temp=b[k][i];
			while(j>0&&temp<b[k][j-1])//依次移动数组顺序 
			{
				cnt1++,cnt2++;
				b[k][j]=b[k][j-1];
				j--;
			}
			b[k][j]=temp;
		}
		int end=clock();
		printf("直接插入排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*------------希尔排序-------------*/ 
void shellsort()//希尔排序
{
	int b[11][maxx];
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
	for(int k=0;k<10;k++)
	{
		int begin=clock();
		int cnt1=0,cnt2=0;//比较次数和移动次数
		int gap;
		for(gap=20000/2;gap>0;gap/=2)//每次的增量,递减趋势
		{
			for(int i=gap;i<20000;i++)//每次增量下,进行几组插入排序
			{
				for(int j=i;j-gap>=0&&b[k][j-gap]>b[k][j];j-=gap)//每个元素组中进行直接插入排序
				{
					swap(&b[k][j-gap], &b[k][j]);
					cnt1++,cnt2++;//移动和比较次数加一 
				}
			}
		}
		int end=clock();
		printf("希尔排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*--------简单选择排序----------*/ 
void chocsort()//简单选择排序 
{
	int b[11][maxx];
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
	for(int k=0;k<10;k++)
	{
		int begin=clock();
		int cnt1=0,cnt2=0;//比较次数和移动次数
		for(int i=0;i<200000-1;i++)
		{
			int _min=i;//记录最小元素位置 
			for(int j=i+1;j<20000;j++)
			{
				if(b[k][j]<b[k][_min])
				{
					cnt1++;_min=j;//更换最小元素位置 
				}
			}
			if(_min!=i)
			{
				cnt2++;
				swap(&b[k][i],&b[k][_min]);//交换位置 
			}
		}
		int end=clock();
		printf("简单选择排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
	
}
/*------冒泡排序-------*/ 
void mpsort()//冒泡排序 
{
	int b[11][maxx];
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
	for(int k=0;k<10;k++)
	{
		int begin=clock(); 
		int cnt1=0,cnt2=0;//比较次数和移动次数
		for(int i=0;i<20000-1;i++)//排序的总轮数 
		{
			for(int j=0;j<20000-1-i;j++)//每轮排序的个数
			{
				if(b[k][j]>b[k][j+1])
				{
					cnt1++;cnt2++;
					swap(&b[k][j],&b[k][j+1]);
				}
			}
		}
		int end=clock();
		printf("冒泡排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*--------快速排序---------*/ 
void quicksort(int l,int r,int *cnt1,int *cnt2,int xx[][maxx],int k)//快速排序函数 
{
	int i,j,t,temp;
	if(l>r) return ;//不符合排序条件,直接返回
	temp=xx[k][l];//temp中存的是基准数
	i=l;j=r;
	while(i!=j)
	{
		//先找右边的数字
		while(xx[k][j]>=temp&&i<j) j--;
		//再找左边的数字
		while(xx[k][i]<=temp&&i<j) i++;
		if(i<j) swap(&xx[k][i],&xx[k][j]);
	}
	xx[k][l]=xx[k][i];
	xx[k][i]=temp;//最终将基准数归位
	quicksort(l,i-1,cnt1,cnt2,xx,k);//继续处理左边的,这里是一个递归的过程
	quicksort(i+1,r,cnt1,cnt2,xx,k);//继续处理右边的 ,这里是一个递归的过程
}
void Qsort()//快速排序
{
	int b[11][maxx];
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) b[i][j]=a[i][j];//按照a数组去初始化b数组
	for(int k=0;k<10;k++)
	{
		int begin=clock();
		int cnt1=0,cnt2=0;//比较次数和移动次数
		quicksort(0,9999,&cnt1,&cnt2,b,k);
		int end=clock();
		printf("快速排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*------基数排序-------*/ 
int max(int date[],int n){//此函数用于求解所给数组中最大数有几位
	int max=0;
	for(int i=0;i<n;i++){
		int count=1,tem=date[i];
		while(tem/10!=0){//计算每个数的位数,用count计数
			tem=tem/10;
			count++;
		}
		if(count>max)
			max=count;//把最大位数赋值max
	}
	return max;
}
void basesort(int date[],int n){
	int max1=max(date,n);//取得最大位数
	int num=1;
	for(int i=0;i<max1;i++){//位数决定排序循环次数
		int count[10];//声明count为了统计每个桶放了几个数
		int temp[10][maxx];//temp相当于桶,前一个数标记第几个篮子,后一个为了标记放的个数
		for(int f=0;f<10;f++){//对声明数组初始化
			count[f]=0;
		}
		for(int g=0;g<10;g++){//对声明数组初始化
			for(int z=0;z<n;z++){
				temp[g][z]=0;
			}
		}
		for(int j=0;j<n;j++){
			int fg=date[j]/num;//num是变量,因为每次循环比较的位是不同的
			int k=fg%10;
			count[k]++;
			int te=count[k]-1;
			temp[k][te]=date[j];//把数据放k桶的te位上存储
		}
		int b=0;
		for(int h=0;h<10;h++){
			if(count[h]>0){//h>0说明h桶内有数字存储
				for(int v=0;v<count[h];v++){//count[h]是h桶的存储个数
					date[b]=temp[h][v];//把桶内排好的数全都倒给要排序的数组,进行下轮排序
					b++;
				}
			}
		}
		num=num*10;
	}
}
void Jssort()//基数排序
{
	int b[maxx];
	for(int k=0;k<10;k++)
	{
		for(int i=0;i<20000;i++) b[i]=a[k][i];
		int begin=clock();
		basesort(b,20000);
		int end=clock();
		printf("基数排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*---------归并排序---------*/
void merge_sort(int *list, int length)
{
    int i, left_min, left_max, right_min, right_max, next;
    int *tmp = (int*)malloc(sizeof(int) * length);
    if (tmp == NULL)
    {
        fputs("Error: out of memory\n", stderr);
        abort();
    }
    for (i = 1; i < length; i *= 2) // i为步长,1,2,4,8……
    {
        for (left_min = 0; left_min < length - i; left_min = right_max)
        {
            right_min = left_max = left_min + i;
            right_max = left_max + i;

            if (right_max > length)
                right_max = length;

            next = 0;
            while (left_min < left_max && right_min < right_max)
                tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];

            while (left_min < left_max)
                list[--right_min] = list[--left_max];

            while (next > 0)
                list[--right_min] = tmp[--next];
        }
    }
    free(tmp);
}
void Gbsort()//归并排序
{
	int b[maxx];
	for(int k=0;k<10;k++)
	{
		for(int i=0;i<20000;i++) b[i]=a[k][i];
		int begin=clock();
		merge_sort(b,20000);
		int end=clock();
		printf("归并排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
/*----------堆排序-----------*/ 
void heapAdjust(int *b,int s,int len)
{
	int temp=b[s];
	for(int j=2*s;j<=len;j*=2)
	{
		if(j<len && b[j]<b[j+1])
			j++;
		if(b[j]>temp)
		{
			b[s]=b[j];
			s=j;
		}
		else
			break;
	}
	b[s]=temp;
}
void heapSort(int *b,int len)
{
	for(int i=len/2;i>=1;i--)
	{
		heapAdjust(b,i,len);
	}
	for(int i=len;i>1;i--)
	{
		swap(&b[1],&b[i]);
		heapAdjust(b,1,i-1);
	}
}
void Dsort()//堆排序
{
	int b[maxx];
	for(int k=0;k<10;k++)
	{
		for(int i=0;i<20000;i++) b[i+1]=a[k][i];
		int begin=clock();
		heapSort(b,20000);
		int end=clock();
		printf("堆排序对第%d个样例的排序时间为:%d\n",k+1,end-begin);
	}
}
int main()
{
	freopen("1.txt","r",stdin);//文件输入
	for(int i=0;i<10;i++)
		for(int j=0;j<20000;j++) 
			scanf("%d",&a[i][j]);
	printf("文件读入完成\n");
	printf("***直接插入排序***\n");zjcrsort();
	printf("***希尔排序***\n");shellsort();
	printf("***简单选择排序***\n");chocsort();
	printf("***冒泡排序***\n");mpsort();
	printf("***快速排序***\n");Qsort();
	printf("***基数排序***\n");Jssort();
	printf("***堆排序***\n");Dsort();
	printf("***归并排序***\n");Gbsort();
	return 0;
}

努力加油a啊,(o)/~

你可能感兴趣的:(八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度)