排序算法比较

利用随机函数产生随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间

#include<stdio.h>
#define MAX 100
void InsertSort(int array[],int n);
void ShellSort(int array[],int n,int dd[],int t);
void BubbleSort(int array[],int n);
void SelectSort(int array[],int n);
void QuickSort(int array[],int min,int max);
void HeapSort(int array[],int n);
void main()
{
	int array[MAX],dd[MAX];
	int n,s,q,ch;
	printf("\n请输入待排序的数的个数:\n");
	scanf("%d",&n);
	printf("请输入待排序数据:\n");
	for(s=0;s<n;s++)
		scanf("%d",&array[s]);
	printf("1---直接插入排序\n");
	printf("2---希尔排序\n");
	printf("3---冒泡排序\n");
	printf("4---快速排序\n");
	printf("5---简单选择排序\n");
	printf("6---堆排序\n");
	printf("请选择(1-6):\n");
	scanf("%d",&ch);
	switch(ch)
	{
	case 1:
		printf("直接插入排序结果:\n");
		InsertSort(array,n);
		break;
	case 2:
		printf("希尔排序结果:\n");
		s=n;                        //初始化一个增量数组
		q=0;
		while(s>1)
		{
			dd[q++]=s/2;
			s=s/2;
		}
		//最后一次的增量为1
		ShellSort(array,n,dd,q);
		break;
	case 3:
		printf("冒泡排序结果:\n");
		BubbleSort(array,n);
		break;
	case 4:
		printf("快速排序结果:\n");
		QuickSort(array,0,n-1);
		break;
	case 5:
		printf("简单选择排序结果:\n");
		SelectSort(array,n);
		break;
	case 6:
		printf("堆排序结果:\n");
		HeapSort(array,n);
		break;
	default:
		return;
	}
	/*输出排序后的节点序列*/
for(s=0;s<n-1;s++)
printf("%d",array[s]);
printf("%d",array[s]);
printf("\n");
}
/*直接插入排序*/
void InsertSort(int array[],int n)
{
	int s,t,q;
	s=1;
	while(s<n)
	{
		t=array[s];    /*是一个临时变量*/
		for(q=s-1;q>=0&&t<array[q];q--)
			array[q+1]=array[q];   /*结点向右移动*/
		array[q+1]=t;
		s++;
	}
}
/*希尔排序*/
void ShellSort(int array[],int n,int dd[],int t)
{
	int s,x,k,h;
	int y;
for(s=0;s<t;s++)
{
	h=dd[s];     /*选取增量*/
	for(x=h;x<n;x++)
	{
		y=array[x];
		for(k=x-h;k>=0&&array[k];k-=h)
			array[k+h]=array[k];  /*想后移动*/
		    array[k+h]=y;
	}
}
}
/*冒泡排序*/
void BubbleSort(int array[],int n)
{
	int s,m,q,t;
	m=0;
	while(m<n-1)    /*如果m==n-1,结束循环*/

	{
		q=n-1;
		for(s=n-1;s>=m+1;s--)
			if(array[s]<array[s-1])
			{
				t=array[s]<array[s-1];
				array[s-1]=t;
				q=s;
			}
			m=q;
	}
}
/*快速排序*/
void QuickSort(int array[],int min,int max)
{
	int head,tail;
	int t;
	if(min<max)
	{
		head=min;
		tail=max;
		t=array[head];
		while(head!=tail)
		{
			while(head<tail&&array[tail]>=t)
				tail--;
			if(head<tail)
				array[head++]=array[tail];
			while(head<tail&&array[head]<=t)
				head++;
			if(head<tail)
				array[tail--]=array[head];
		}
		array[head]=t;
		QuickSort(array,min,head-1);
		QuickSort(array,tail+1,max);
	}
}
/*选择排序*/
void SelectSort(int array[],int n)
{
	int k,q,s,t;
	for(s=0;s<n;s++)
	{
		k=s;
		for(q=s+1;q<n;q++)
			if(array[k]>array[q])
				k=q;
			t=array[s];
			array[s]=array[k];
			array[s]=t;
	}
}
/*调整为堆*/
void PercDown(int array[],int s,int n)
{
	int q;
	int t;
	t=array[s];
	while((q=2*s+1)<n)/*有左孩子*/
	{
		if(q<n-1&&array[q]<array[q+1])
			q++;
		if(t<array[q])
		{
			array[(q-1)/2]=array[q];
			s=q;
		}
		else
			break;
	}
	array[(q-1)/2]=t;  /*t放在最后一个位置*/
}
/*堆排序*/
void HeapSort(int array[],int n)
{
	int s;
	int t;
	s=(n-1)/2;
	while(s>=0)
	{
		PercDown(array,s,n);
		s--;
	}
	s=n-1;
	while(s>0)
	{
		t=array[0];   /*交换结点*/
		array[0]=array[s];
		array[s]=t;
		PercDown(array,0,s);
		s--;
	}
}

猜你喜欢

转载自blog.csdn.net/markin2333/article/details/81205646