1、stdio.hstdlib.htime.h#define MAX 50/ 顺序表结构体typedef struct int sMAX; / 存放一批随机整数,数组大小MAX不能扩充 int length; / 当前表中元素的个数 SeqList;/ 功能菜单void menu() printf(nt*排-序*n);t* 1 随机产生一批整数 *nt* 2 手动输入一批整数 *nt* 3 将表中数据随机化 *nt* 4 快速排序 *nt* 5 希尔排序 *nt* 6 堆排序 *nt* 7 归并排序 *nt* 8 依次显示表中所有数据 *nt* 0 退出程序 *nt*n/* 初始化一个空的顺序表
2、*/SeqList *init() / 开辟顺序表空间 SeqList *p=(SeqList *)malloc(sizeof(SeqList); / 设置顺序表的初始长度为0 p-length=0; / 返回整个顺序表的(起始)地址 return p;/* 随机产生一批整数到线性表中 */void randGen(SeqList *p) int num, i;请输入元素个数(=%d):n, MAX-1); scanf(%d, &num); srand(int)time(0); if(num = MAX) / 随机产生num个整数存入顺序表中(从1号单元开始存放,0号单元留作“哨兵”) for
3、(i=1; isi=1+(int)(100.0*rand()/(RAND_MAX+1.0); p-length=num; printf(顺序表中已成功放入%d个整数!, num); else顺序表空间不够,请重新输入元素个数!/* 手动输入一批整数到线性表中 */void manInput(SeqList *p)请输入%d个整数:= MAX-1) / 输入num个整数存入顺序表中(从1号单元开始存放,0号单元留作“哨兵”) scanf(p-si);顺序表中已成功输入%d个整数!/* 将顺序表中现有元素打乱为随机排列 */void randomizeList(SeqList *p) int i,
4、 selectLoc, tmp; / 借助选择法排序的思想,每次从尚未挑选的序列中随机挑选一个元素, / 将随机选中的元素交换到尚未选中元素序列的最前面或最后面。 for(i=1;p-length; / 产生一个属于区间i,p-length的随机数selectLoc selectLoc = i+(int)(p-length-i)*rand()/(RAND_MAX+1.0); if(selectLoc != i) tmp = p-si;si = p-sselectLoc;sselectLoc = tmp; / 反过来再来一遍 for(i=p- i1; i-) / 产生一个属于区间0,i的随机数s
5、electLoc selectLoc = 1+(int)(i*rand()/(RAND_MAX+1.0);顺序表中的元素已经重新随机排列!/ 快速排序划分函数int Partition(int R, int low, int high) /对记录子序列Rlow.high进行一趟快速排序,并返回枢轴记录所在位置 int pivotkey; R0=Rlow; pivotkey=Rlow; while(lowhigh) /从表的两端交替向中间扫描 while(low=pivotkey) -high; if(lowhigh) Rlow+=Rhigh; /将比枢轴记录小的记录移到低端 Rlow +low
6、; Rhigh-=Rlow; /将比枢轴记录大的记录移到高端 Rlow=R0; return low; / 最后返回枢轴的位置(下标)/ 快速排序递归函数void QSort(int R, int s, int t) / 对记录Rs.t进行快速排序 int pivotloc; if(ss,1,p-length);已采用快速排序算法成功排序!/ 一趟希尔插入排序(实质为直接插入排序的变形)void shellInsert(SeqList *p, int dk) int i, j; for(i=dk+1;=p- +i) if(p-si / 设置插入排序的“哨兵” for(j=i-dk; j0 &s
7、0 sj+dk = p- s0;/* 希尔排序(缩小增量排序),假设增量设置为5,3,1 */void shellSort(SeqList *p, int dlta, int t) int k; / 按增量序列dlta0.t-1对顺序表中的元素作希尔排序 for(k=0; ksm.n区间元素重新调整为堆的函数void heapAdjust(SeqList *p, int m, int n) / 使得p-sm.n成为大堆 int j,rc; rc=p-sm; for(j=2*m; j=n; j*=2) if(jn &sj sj) break;sm=p- m=j;sm=rc;/* 堆排序 */vo
8、id heapSort(SeqList *p) / 对顺序表p进行堆排序 int rc,i;length/2;0; -i) heapAdjust(p,i,p- rc=p-s1;s1=p-si=rc; heapAdjust(p,1,i-1);已采用堆排序算法成功排序!/ 归并排序合并有序表/ 将有序的SR1.m和SRm+1.n归并为有序的TRi.nvoid Merge(int SR, int TR, int i, int m, int n) / 将有序的SRi.m和SRm+1.n归并为有序的TRi.n int k,j; for(j=m+1,k=i;=m & +k) /将SR中记录由小到大的并入T
9、R if(SRi=SRj) TRk=SRi+; else TRk=SRj+; while(i=m) TRk+=SRi+; /将剩余的SRi.m复制到TR while(jlength+1)*sizeof(int); / 调用递归函数作归并排序 Msort(p-s, auxSpa, p-s, 1, p- / 释放辅助空间 free(auxSpa);已采用归并排序算法成功排序!/* 显示表中所有数据 */void showAll(SeqList *p) int i; if(p-length 0)当前表中的元素个数为%d,依次如下:, p- printf(%d si);当前顺序表为空!void mai
10、n() int choice=-1; SeqList *plist; int incArr=5,3,1; / 将希尔排序的增量设置为5,3,1 plist=init(); while(1) menu(); fflush(stdin);t请选择一个菜单项: scanf(choice); switch(choice) case 1: / 随机产生一组整数放入表中 randGen(plist); showAll(plist); break; case 2: / 手动输入一批整数放入表中 manInput(plist); case 3: / 将现有表中数据随机化排列 randomizeList(plist); case 4: / 快速排序 quickSort(plist); case 5: / 希尔排序(增量为3个,依次为5,3,1) shellSort(plist, incArr, 3); case 6: / 堆排序 heapSort(plist); case 7: / 归并排序 mergeSort(plist); case 8: / 按顺序显示表中所有数据 case 0: exit(0); default:t您输入的菜单项不存在,请重新选择! choice=-1; / 表示未选择菜单项 或者 菜单项选择错误
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1