软件技术基础实验课-四.排序

软件技术基础实验课代码

 四.排序一章

#include <stdio.h>
#include <time.h>
#define size 11
typedef char datatype;
typedef struct
{
	int key;
	datatype others;
} rectype;
/************插入排序********/
//26 5 37 1 61 11 59 15 48 19
void INSERTSORT(int a[])
{
	int i, j, k = 0;
	for(i = 2; i < size; i++)
	{
		a[0] = a[i];
		j = i - 1;
		while( a[0] < a[j])
		{
			a[j + 1] = a[j];
			j--;
		}
		a[j+1] = a[0];
	}
}
void SHELLSORT(rectype R[], int n)
{
	int i, j, h;
	rectype temp;
	h = n/2;
	while(h > 0)
	{
		for(j = h; j <= n - 1; j++)
		{
			temp = R[j];
			i = j - h;
			while((i >= 0) && temp.key < R[i].key)
			{
				R[i + h] = R[i];
				i = i - h;
			}
			R[i + h] = temp;
		}
		h = h/2;
	}
}
/************快速排序算法**************/
int PARTITION(rectype R[], int l, int h)
{
	int i, j;
	rectype temp;
	i = l, j = h, temp = R[i];
	do
	{
		while( ( R[j].key >= temp.key) && ( i < j))
			j--;
		if(i < j) R[i++]= R[j];
		while( (R[i].key <= temp.key) && (i < j))
			i++;
		if(i < j)
			R[j--] = R[i];
	}
	while(i != j);
	R[i] = temp;
	return i;
}
void QUICKSORT(rectype R[], int s1, int t1)
{
	int i;
	if(s1 < t1)
	{
		i = PARTITION(R,s1,t1);
		QUICKSORT(R,s1,i - 1);
		QUICKSORT(R,i+1,t1);
	}
}//快排
void main()
{
	int a[11]={0};
	rectype R[size];
	int i;
	printf("请输入使用插入排序法排序的10个数据:\n");
	for(i = 1; i < size; i++)
		scanf("%d",&a[i]);
	printf("排序之前\n");
	
	for(i = 1; i < size; i++)
		printf("%d\t",a[i]);
	printf("\n");
	
	INSERTSORT(a);
	printf("插入排序过后\n");
	for(i = 1; i < size; i++)
		printf("%d\t",a[i]);
	printf("\n");
	
	
	
	//希尔测试
	printf("\n请输入用于希尔排序测试的10个数据\n");
	for(i  = 0; i < size - 1; i++)
		scanf("%d",&R[i].key);
	printf("排序之前:\n");
	for(i = 0; i < size - 1; i++)
		printf("%d\t",R[i].key);
	SHELLSORT(R,10);
	printf("\n排序后:\n");
	for(i = 0; i < size - 1; i++)
		printf("%d\t",R[i].key);
		
		
		
	//快速排序
	printf("\n请输入用于快速排序算法的10个数据:\n");
	for(i = 1; i < size; i++)
		scanf("%d",&R[i].key);
	printf("排序前:\n");
	for(i = 1; i < size; i++)
		printf("%d\t",R[i].key);
	printf("\n排序后:\n");
	QUICKSORT(R,1,10);
	for(i = 1; i < size; i++)
		printf("%d\t",R[i].key);
}

插入排序:将R[0]设置为监视哨,然后从输入数据的第二个数字开始,让R[0] = 这个数,
然后依次从后向前比较如果这个数字比R[0]大的话,就将这个数字向后挪动一位,如果这个数字比R[0]小的话,而且它的后一位比R[0]大,则在这两个数字之间插入R[0]。
希尔排序:先排序好一部分数据,然后再慢慢的扩充排序的数据个数,本实验有10个数据个数,于是将n = 10,先将h = n/2,然后先排好大于等于h的下标的元素的数据,然后每次让h减半,直到h = 0,就完成了整个排序。
快速排序:就是先设定一个中间值,然后将小于这个数的数据移动到它的左边,将大于这个中间元的数据移动到它的右边,之后再以这个中间值为边界,再对它的左边和右边的数据重复此操作,直到所有的数据排序完成。
效率比较:冒泡<插入<希尔<快速

猜你喜欢

转载自blog.csdn.net/CSDNsabo/article/details/91863428