实现直接插入、冒泡、直接选择排序算法。
#include <stdio.h>
#include <stdlib.h>
typedef char InfoType;
#define n 10 //假设的文件长度,即待排序的记录数目
typedef char KeyType; //假设的关键字类型
typedef struct { //记录类型
KeyType key; //关键字项
InfoType otherinfo; //其它数据项,类型InfoType依赖于具体应用而定义
} RecType;
typedef RecType SeqList[n+1]; //SeqList为顺序表类型,表中第0个单元一般用作哨兵
void InsertSort(SeqList R);
void BubbleSort(SeqList R);
void SelectSort(SeqList R);
//测试用例
//阴阳乾兑离震巽坎艮坤
int main()
{
int i;
SeqList R; //R是大小为n+1的结构数组
char choice;
while (1)
{
system("cls");
printf("\n\n\n\n");
printf("\t\t 线性表的排序 \n");
printf("\t\t======================================");
printf("\n\n");
printf("\t\t 1:建立线性表 \n");
printf("\t\t 2:显示线性表 \n");
printf("\t\t 3:插入排序 \n");
printf("\t\t 4:冒泡排序 \n");
printf("\t\t 5:直接选择排序 \n");
printf("\n");
printf("\t\t 0:退出 \n");
printf("\n");
printf("\t\t请选择:");
choice = getchar();
system("cls");
switch(choice)
{
case '1':
printf("请输入欲排序的数(10个):\n");
for (i=1;i<=n;i++)
scanf("%c",&R[i].key);
printf("线性表创建成功!\n");
system("Pause");
break;
case '2':
printf("线性表中的数据为:\n");
for (i=1;i<=n;i++)
printf("%d ",R[i].key);
system("Pause");
break;
case '3':
InsertSort(R);
printf("插入排序成功!\n");
system("Pause");
break;
case '4':
BubbleSort(R);
printf("冒泡排序成功!\n");
system("Pause");
break;
case '5':
SelectSort(R);
printf("直接选择排序成功!\n");
system("Pause");
break;
case '0':
exit(0);
}
}
}
//对顺序表R中的记录R[1..n]按递增序进行插入排序
void InsertSort(SeqList R)
{
int i,j;
for(i=2;i<=n;++i)
if( R[i].key<R[i-1].key) { // 将 R[i] 插入有序子表
R[0]=R[i]; // 复制为哨兵
R[i]=R[i-1];
for(j=i-2; R[0].key<R[j].key;--j)
R[j+1]=R[j]; // 记录后移
R[j+1]=R[0]; // 插入到正确位置
}
}
//R[1..n]是待排序的文件,采用自下而上扫描对R做冒泡排序
void BubbleSort(SeqList R)
{
int m,i,j,flag=1; RecType x;
m=n-1;
while((m>0)&&(flag==1))
{ flag=0;
for(j=1;j<=m;j++)
if(R[j].key>R[j+1].key)
{ flag=1;
x=R[j];R[j]=R[j+1];R[j+1]=x; // 交换
}//endif
m--;
}//endwhile
}
//对R[1..n]进行直接选择排序,用R[0]做暂存单元
void SelectSort(SeqList R)
{
RecType x;
int k,i,j;
for (i=1; i<n; ++i)
{ // 在 R[i..n] 中选择 key 最小的记录
k=i;
for( j=i+1;j<=n ; j++)//遍历找最小
if ( R[j].key <R[k].key) k=j;
if(k!=i) {x=R[k];R[k]=R[i];R[i]=x; } //交换
}
}
声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。