实现直接插入、冒泡、直接选择排序算法。
#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; // 交换}//endifm--;}//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; } //交换}
}
声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。