实验内容:分别使用直接插入排序、冒泡排序、简单选择排序方法,将用户随机输入的一列数据按递增的顺序排好,并在其中一种排序算法中输出每趟排序的序列。
#include<stdio.h>
typedef int KeyType; //定义关键字类型
typedef struct //记录类型
{ KeyType key; //关键字项
// InfoType data; //其他数据项,类型为InfoType
} RecType; //排序的记录类型定义
void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{ int i,j; RecType temp;
for (i=1;i<n;i++)
{ printf("第%d趟:",i);
temp=R[i];
j=i-1; //从右向左在有序区R[0..i-1]找R[i]的插入位置
while (j>=0 && temp.key<R[j].key)
{ R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
j--;
}
R[j+1]=temp; //在j+1处插入R[i]
for(j=0;j<10;j++) printf("%d ",R[j].key);
printf("\n");
}
}
void BubbleSort(RecType R[],int n) //冒泡排序
{ int i,j; RecType temp;
for (i=0;i<n-1;i++)
{ for (j=n-1;j>i;j--) //比较找本趟最小关键字的记录
if (R[j].key<R[j-1].key)
{ temp=R[j]; //R[j]与R[j-1]进行交换
R[j]=R[j-1];
R[j-1]=temp;
}
}
}
void SelectSort(RecType R[],int n) //简单选择排序
{ int i,j,k; RecType temp;
for (i=0;i<n-1;i++) //做第i趟排序
{ k=i;
for (j=i+1;j<n;j++) //在[i..n-1]中选key最小的R[k]
if (R[j].key<R[k].key)
k=j; //k记下的最小关键字所在的位置
if(k!=i) //交换R[i]和R[k]
{ temp=R[i]; R[i]=R[k]; R[k]=temp; }
}
}
void main()
{ RecType r[10],rr[10];
int i;
printf("请输入待排序的10个关键字:\n");
for(i=0;i<10;i++)
scanf("%d",&r[i].key);
for(i=0;i<10;i++)
rr[i].key=r[i].key;
printf("\n");
printf("简单选择排序的结果为:\n");
SelectSort(rr,10);
for (i=0;i<10;i++) printf("%d ",rr[i].key);
printf("\n");
for(i=0;i<10;i++)
rr[i].key=r[i].key;
printf("冒泡排序的结果为:\n");
BubbleSort(rr,10);
for (i=0;i<10;i++) printf("%d ",rr[i].key);
printf("\n");
for(i=0;i<10;i++)
rr[i].key=r[i].key;
printf("直接插入排序的结果为:\n");
InsertSort(rr,10);
printf("\n");
}
请输入待排序的10个关键字:
2 3 5 78 37 29 23 4 92 74
简单选择排序的结果为:
2 3 4 5 23 29 37 74 78 92
冒泡排序的结果为:
2 3 4 5 23 29 37 74 78 92
直接插入排序的结果为:
第1趟:2 3 5 78 37 29 23 4 92 74
第2趟:2 3 5 78 37 29 23 4 92 74
第3趟:2 3 5 78 37 29 23 4 92 74
第4趟:2 3 5 37 78 29 23 4 92 74
第5趟:2 3 5 29 37 78 23 4 92 74
第6趟:2 3 5 23 29 37 78 4 92 74
第7趟:2 3 4 5 23 29 37 78 92 74
第8趟:2 3 4 5 23 29 37 78 92 74
第9趟:2 3 4 5 23 29 37 74 78 92