实验十内部排序

实验十内部排序

完善“参考源程序”,进行典型内部排序算法的比较。
(1) 随机产生整数样本,进行8种排序,并比较各种排序算法的执行时间,如执行时间均为0,可考虑增大样本,如加大至5000或10000。
(2) 设计方案,修改“12.11.4 参考源程序”,对8种排序算法的数据元素比较次数和移动次数进行比较。
(3) 输出8种排序算法每一趟排序的输出结果。

# include <stdio.h>
# include <stdlib.h>
# include <time.h>
#include <windows.h>
 
#define WIDTH 20 
#define MAXK 10
 
int n=0;
long num,compare;
int da[2000000];
int dd[2000000];

void myhead(){
	printf("---    1.直接插入排序     	---\n");
	printf("---    2.折半插入排序     	---\n");
	printf("---    3.希尔排序      		---\n");
	printf("---    4.冒泡排序     		---\n");
	printf("---    5.快速排序     		---\n");
	printf("---    6.选择排序       	---\n");
	printf("---    7.堆排序     		---\n");
	printf("---    8.归并排序		---\n");
	printf("---    9.退出程序     		---\n");
	printf("\n");
}
 
void rand1()//随机数创建数组 
{
	int i;
	srand((unsigned)time(NULL)); /*随机种子*/
	for(i = 0; i < n; i ++) 
		dd[i] = rand();
}
 
void init()//将dd[]赋值给da[] 
{
	for(int i=0;i<n;i++)
		da[i]=dd[i];
	num=0;
	compare=0;
}
 
void swap(int *a,int *b)//数据交换 
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
	num++;
}

void BubbleSort()//冒泡排序 
{
	int i,j,k=0;
	for(i=0;i<n-1;i++)
		for(j=n-1;j>i;j--)
		{
			compare++;
			if(da[j]<da[j-1])
			swap(&da[j],&da[j-1]);
		}
	for(i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}
 
void SelectSort()//选择排序 
{ 
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		temp=i;
		for(j=i+1;j<n;j++)
		{
			compare++;
			if(da[j]<da[temp])
			{
				temp=j;
				num++;
			}
		}
		if(temp!=i)
			swap(&da[temp],&da[i]);
	}
	for(i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}
 
void InsertSort()//插入排序 
{
	int i,j;
	int temp=0;
	for(i=1;i<n;i++)
	{
		temp=da[i];
		for(j=i;j>0 && temp<da[j-1];j--)
		{
			compare++;
			if(temp < da[j-1])
				swap(&da[j],&da[j-1]);
		}
		da[j] = temp;
	}
	for(i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}
 

 
void qsort(int l,int r)//一趟快速排序 
{
	int i, j, x;
	if (l<r)
	{
		i=l;
		j=r;
		x=da[i];
		while(i<j)
		{
			while(i<j&&da[j]>x)
			{
				j--;
				compare++;
			}
			if(j<j)
				da[i++]=da[j];
			while(i<j&&da[i]<x)
			{
				i++;
				compare++;
			}
			if(i<j)
				da[j--]=da[i];
		 } 
		da[i]=x;
		num++;
		qsort(l,i-1);
		qsort(i+1,r);
	}
	
}
void QuickSort()//快速排序 
{
	qsort(0,n);	
	for(int i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}

void HeapAdjust(int i, int nLength)
{
	int nChild, nTemp;
	for (nTemp=da[i];2*i+1<nLength;i=nChild)
	{
        	nChild=2*i+1;
        	compare++;
        	if (nChild!=nLength-1 && da[nChild+1]>da[nChild])
            	++nChild;
        	if (nTemp<da[nChild])
			{
				da[i]=da[nChild];
				num++;
        	}
			else{break;}
	}
	da[i]=nTemp;
}
void mydui()
{
	int i;
	for (i=n/2-1;i>=0;--i)
	{
		HeapAdjust(i,n);
	}
	for (i=n-1;i>0;--i)
	{
		swap(&da[0],&da[i]);
        HeapAdjust(0,i);
	}
	for(i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
 
}


void Merge(int left, int m, int right)
{
	int aux[200000]={0};
    	int i;
    	int j;
    	int k;
    	for (i=left,j=m+1,k=0;k<=right-left;k++){
		num++;
		compare++;
        	if (i==m+1)
			{
            	aux[k] = da[j++];
           		continue;
        	}
        	if(j==right+1)
			{
            	aux[k] = da[i++];
            	continue;
        	}
        	if(da[i]<da[j])
			{
            	aux[k] = da[i++];
        	}
			else
			{
            	aux[k]=da[j++];
			}
    	}
	for (i=left,j=0;i<=right;i++,j++){
		da[i]=aux[j];
	}
}
void MergeSort(int start,int end)//一次归并排序 
{
	if(start<end)
	{
        int i;
        i = (end + start) / 2;
        MergeSort(start, i);
        MergeSort(i + 1, end);
	    Merge(start, i, end);
    }
    
}
void myguibing()//归并排序 
{ 
	MergeSort(0,n-1);
	for(int i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}
 
 
 void ShellSort()//希尔排序 
{
	int i, j, k;
	int t,g;  
	for (g=n/2;g>0;g/=2)
	{
        for (i=0;i<g;i++)
		{
			for(j=i+g;j<n;j+=g)
			{
				if (da[j]<da[j-g])
				{
					t=da[j];  
					k=j-g;
					while (k>=0 && da[k]>t)
					{
						da[k+g]=da[k];
						k-=g;
					}
					da[k+g]=t;
					num++;
				}
				compare++;
			}
				
		}
	}
 	for(i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}

void BInsertSort()
{
 
	int left=0,right=n;
	int low,high,mid;
	int temp;
 
	for(int i=left+1;i<=right;++i)
	{
		temp=da[i]; 
		low=left; 
		high=i-1;    
		while(low<=high){    
			mid=(low+high)/2;
			if(da[i]<da[mid])  
				high=mid-1;            
			else     
				low=mid+1;
				compare++;
		}
		for(int j=i-1;j>=low;--j)
			da[j+1]=da[j];
		da[low]=temp;
		num++; 
	}
 for(int i=0;i<n;i++)
		printf("%d   ",da[i]);
	printf("\n");
}
 
double a=1;
long b=10000000;
long c=10000000;
void aaa(double t,long num,long compare,int i)
{
	if(t<a)
		a=t;
	if(num<b)
		b=num;
	if(compare<c)
		c=compare;	
	if(i)
	{
		printf("插入排序最短时间:        %f秒\n",a);
		printf("插入排序最少交换次数:    %ld\n",b);
		printf("插入排序最少比较次数:    %ld\n",c);
	}
		
}




int main()
{	
	clock_t t1,t2;
	double t;

	myhead();
	printf("请输入要产生的随机数的个数:");
	scanf("%d",&n);
	rand1();
	printf("\n");
	
	
	while(1){	
		init();	
		printf("\n");	
		printf("请选择排序算法:");
		int ch;
		scanf("%d", &ch);
		
		switch(ch){
			case 1 :
					t1=clock();
					InsertSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("插入排序时间:        %f秒\n",t);
					printf("插入排序交换次数:    %ld\n",num);
					printf("插入排序比较次数:    %ld\n",compare);
					
					aaa(t,num,compare,0);
					break;
					
					
			case 2 :	
					t1=clock();
					BInsertSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("折半插入时间:        %f秒\n",t); 
					printf("折半插入交换次数:    %ld\n",num);
					printf("折半插入比较次数:    %ld\n",compare);
					aaa(t,num,compare,0);
					break;
			case 3 : 					
					t1=clock();
					ShellSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("希尔排序时间:        %f秒\n",t);
					printf("希尔排序交换次数:    %ld\n",num);
					printf("希尔排序比较次数:    %ld\n",compare); 
					aaa(t,num,compare,0);
					break;
			case 4 : 					
					t1=clock();
					BubbleSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;  //运行时间 
					printf("冒泡排序时间:        %f秒\n",t);
					printf("冒泡排序交换次数:    %ld\n",num);
					printf("冒泡排序比较次数:    %ld\n",compare);
					aaa(t,num,compare,0);
					break;
			case 5 : 					
					t1=clock();
					QuickSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("快速排序时间:        %f秒\n",t);
					printf("快速排序交换次数:    %ld\n",num);
					printf("快速排序比较次数:    %ld\n",compare); 
					aaa(t,num,compare,0);
					break;
			case 6 : 	
					t1=clock();
					SelectSort();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("选择排序时间:        %f秒\n",t);
					printf("选择排序交换次数:    %ld\n",num);
					printf("选择排序比较次数:    %ld\n",compare); 
					aaa(t,num,compare,0);
					break;	
			case 7 : 
					t1=clock();
					mydui();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("堆排序时间:        %f秒\n",t);
					printf("堆排序交换次数:    %ld\n",num);
					printf("堆排序比较次数:    %ld\n",compare);
					aaa(t,num,compare,0);
					break;
			case 8 : 					
					t1=clock();
					myguibing();
					t2=clock();
					t = (double)(t2-t1)/CLOCKS_PER_SEC;
					printf("归并排序时间:        %f秒\n",t); 
					printf("归并排序交换次数:    %ld\n",num);
					printf("归并排序比较次数:    %ld\n\n",compare);
					aaa(t,num,compare,1);
					break;
			case 9 : 
				return 0;	
		}
	}	
}

在这里插入图片描述
在这里插入图片描述
折半插入排序或快速排序输出的第一个数据莫名出现0,以后修改


版权声明:本文为qq_51233271原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。