c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx
- 文档编号:6968944
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:10
- 大小:18.44KB
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx
《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx》由会员分享,可在线阅读,更多相关《c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx(10页珍藏版)》请在冰豆网上搜索。
c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序
/*Note:
YourchoiceisCIDE*/
#include"stdio.h"
#include"stdlib.h"
#defineMAX4
voidSequenceSearch(int*fp,intLength);
voidSearch(int*fp,intlength);
voidSort(int*fp,intlength);
/*
================================================
功能:
选择排序
输入:
数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
voidselect_sort(int*x,intn)
{
inti,j,min,t;
for(i=0;i 0~n-2共n-1次*/ { min=i;/*假设当前下标为i的数最小,比较后再调整*/ for(j=i+1;j { if(*(x+j)<*(x+min)) { min=j;/*如果后面的数比前面的小,则记下它的下标*/ } } if(min! =i)/*如果min在循环中改变了,就需要交换数据*/ { t=*(x+i); *(x+i)=*(x+min); *(x+min)=t; } } } /* ================================================ 功能: 直接插入排序 输入: 数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ voidinsert_sort(int*x,intn) { inti,j,t; for(i=1;i 1~n-1共n-1次*/ { /* 暂存下标为i的数。 注意: 下标从1开始,原因就是开始时 第一个数即下标为0的数,前面没有任何数,单单一个,认为 它是排好顺序的。 */ t=*(x+i); for(j=i-1;j>=0&&t<*(x+j);j--)/*注意: j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。 */ { *(x+j+1)=*(x+j);/*如果满足条件就往后挪。 最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/ } *(x+j+1)=t;/*找到下标为i的数的放置位置*/ } } /* ================================================ 功能: 冒泡排序 输入: 数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ voidbubble_sort(int*x,intn) { intj,k,h,t; for(h=n-1;h>0;h=k)/*循环到没有比较范围*/ { for(j=0,k=0;j { if(*(x+j)>*(x+j+1))/*大的放在后面,小的放到前面*/ { t=*(x+j); *(x+j)=*(x+j+1); *(x+j+1)=t;/*完成交换*/ k=j;/*保存最后下沉的位置。 这样k后面的都是排序排好了的。 */ } } } } /* ================================================ 功能: 希尔排序 输入: 数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ voidshell_sort(int*x,intn) { inth,j,k,t; for(h=n/2;h>0;h=h/2)/*控制增量*/ { for(j=h;j { t=*(x+j); for(k=j-h;(k>=0&&t<*(x+k));k-=h) { *(x+k+h)=*(x+k); } *(x+k+h)=t; } } } /* ================================================ 功能: 快速排序 输入: 数组名称(也就是数组首地址)、数组中起止元素的下标 ================================================ */ voidquick_sort(int*x,intlow,inthigh) { inti,j,t; if(low 这里以下标为low的元素为基准点*/ { i=low; j=high; t=*(x+low);/*暂存基准点的数*/ while(i { while(i { j--;/*前移一个位置*/ } if(i { *(x+i)=*(x+j);/*上面的循环退出: 即出现比基准点小的数,替换基准点的数*/ i++;/*后移一个位置,并以此为基准点*/ } while(i { i++;/*后移一个位置*/ } if(i { *(x+j)=*(x+i);/*上面的循环退出: 即出现比基准点大的数,放到右边*/ j--;/*前移一个位置*/ } } *(x+i)=t;/*一遍扫描完后,放到适当位置*/ quick_sort(x,low,i-1); /*对基准点左边的数再执行快速排序*/ quick_sort(x,i+1,high); /*对基准点右边的数再执行快速排序*/ } } /* ================================================ 功能: 堆排序 输入: 数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* 功能: 渗透建堆 输入: 数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始 */ voidsift(int*x,intn,ints) { intt,k,j; t=*(x+s);/*暂存开始元素*/ k=s; /*开始元素下标*/ j=2*k+1;/*右子树元素下标*/ while(j { if(j 满足就继续下一轮比较,否则调整。 */ { j++; } if(t<*(x+j))/*调整*/ { *(x+k)=*(x+j); k=j;/*调整后,开始元素也随之调整*/ j=2*k+1; } else/*没有需要调整了,已经是个堆了,退出循环。 */ { break; } } *(x+k)=t;/*开始元素放到它正确位置*/ } /* 功能: 堆排序 输入: 数组名称(也就是数组首地址)、数组中元素个数 */ voidheap_sort(int*x,intn) { inti,k,t; //int*p; for(i=n/2-1;i>=0;i--) { sift(x,n,i);/*初始建堆*/ } for(k=n-1;k>=1;k--) { t=*(x+0);/*堆顶放到最后*/ *(x+0)=*(x+k); *(x+k)=t; sift(x,k,0);/*剩下的数再建堆*/ } } /*构造随机输出函数类*/ voidinput(inta[]){ inti; srand((unsignedint)time(NULL)); for(i=0;i<4;i++) { a[i]=rand()%100; } printf("\n"); } /*构造键盘输入函数类*/ /*voidinput(int*p) { inti; printf("请输入%d个数据: \n",MAX); for(i=0;i { scanf("%d",p++); } printf("\n"); }*/ /*构造输出函数类*/ voidoutput(int*p) { inti; for(i=0;i { printf("%d",*p++); } } //归并排序中的合并算法 voidMerge(inta[],intstart,intmid,intend) { inti,k,j,temp1[10],temp2[10]; intn1,n2; n1=mid-start+1; n2=end-mid; //拷贝前半部分数组 for(i=0;i { temp1[i]=a[start+i]; } //拷贝后半部分数组 for(i=0;i { temp2[i]=a[mid+i+1]; } //把后面的元素设置的很大 temp1[n1]=temp2[n2]=1000; //逐个扫描两部分数组然后放到相应的位置去 for(k=start,i=0,j=0;k<=end;k++) { if(temp1[i]<=temp2[j]) { a[k]=temp1[i]; i++; } else { a[k]=temp2[j]; j++; } } } //归并排序 voidMergeSort(inta[],intstart,intend) { if(start { inti; i=(end+start)/2; //对前半部分进行排序 MergeSort(a,start,i); //对后半部分进行排序 MergeSort(a,i+1,end); //合并前后两部分 Merge(a,start,i,end); } } /*顺序查找*/ voidSequenceSearch(int*fp,intLength) { inti; intdata; printf("开始使用顺序查询.\n请输入你想要查找的数据.\n"); scanf("%d",&data); for(i=0;i if(fp[i]==data) { printf("经过%d次查找,查找到数据%d,表中位置为%d.\n",i+1,data,i); return; } printf("经过%d次查找,未能查找到数据%d.\n",i,data); } /*二分查找*/ voidSearch(int*fp,intLength) { intdata; intbottom,top,middle; inti=0; printf("开始使用二分查询.\n请输入你想要查找的数据.\n"); scanf("%d",&data); printf("由于二分查找法要求数据是有序的,现在开始为数组排序.\n"); Sort(fp,Length); printf("数组现在已经是从小到大排列,下面将开始查找.\n"); bottom=0; top=Length; while(bottom<=top) { middle=(bottom+top)/2; i++; if(fp[middle] { bottom=middle+1; } elseif(fp[middle]>data) { top=middle-1; } else { printf("经过%d次查找,查找到数据%d,在排序后的表中的位置为%d.\n",i,data,middle); return; } } printf("经过%d次查找,未能查找到数据%d.\n",i,data); } voidSort(int*fp,intLength) { inttemp; inti,j,k; printf("现在开始为数组排序,排列结果将是从小到大.\n"); for(i=0;i for(j=0;j if(fp[j]>fp[j+1]) { temp=fp[j]; fp[j]=fp[j+1]; fp[j+1]=temp; } printf("排序完成! \n下面输出排序后的数组: \n"); for(k=0;k { printf("%5d",fp[k]); } printf("\n"); } voidmain() { intstart=0,end=3; int*p,i,a[MAX]; intcount=MAX; intarr[MAX]; intchoise=0; /*printf("请输入你的数据的个数: \n"); scanf("%d",&count);*/ /*printf("请输入%d个数据\n",count); for(i=0;i { scanf("%d",&arr[i]); }*/ /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); do { printf("1.使用顺序查询.\n2.使用二分查找法查找.\n3.退出\n"); scanf("%d",&choise); if(choise==1) SequenceSearch(a,count); elseif(choise==2) Search(a,count); elseif(choise==3) break; }while(choise==1||choise==2||choise==3); /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试选择排序*/ p=a; printf("选择排序之后的数据: \n"); select_sort(p,MAX); output(a); printf("\n"); system("pause"); /**/ /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试直接插入排序*/ printf("直接插入排序之后的数据: \n"); p=a; insert_sort(p,MAX); output(a); printf("\n"); system("pause"); /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试冒泡排序*/ printf("冒泡排序之后的数据: \n"); p=a; insert_sort(p,MAX); output(a); printf("\n"); system("pause"); /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试快速排序*/ printf("快速排序之后的数据: \n"); p=a; quick_sort(p,0,MAX-1); output(a); printf("\n"); system("pause"); /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试堆排序*/ printf("堆排序之后的数据: \n"); p=a; heap_sort(p,MAX); output(a); printf("\n"); system("pause"); /*录入测试数据*/ input(a); printf("随机初始数组为: \n"); output(a); printf("\n"); /*测试归并排序*/ printf("归并排序之后的数据: \n"); p=a; MergeSort(a,start,end); output(a); printf("\n"); system("pause"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 归并 选择 直接 插入 希尔 冒泡 快速 排序 顺序 二分 查找