软件技术基础实验课代码
四.排序一章
#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,就完成了整个排序。
快速排序:就是先设定一个中间值,然后将小于这个数的数据移动到它的左边,将大于这个中间元的数据移动到它的右边,之后再以这个中间值为边界,再对它的左边和右边的数据重复此操作,直到所有的数据排序完成。
效率比较:冒泡<插入<希尔<快速