ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:18.44KB ,
资源ID:6968944      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6968944.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序.docx

1、c语言归并选择直接插入希尔冒泡快速堆排序与顺序二分查找排序/* Note:Your choice is C IDE */#include stdio.h#includestdlib.h#define MAX 4void SequenceSearch(int *fp,int Length);void Search(int *fp,int length);void Sort(int *fp,int length);/*=功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数=*/void select_sort(int *x, int n) int i, j, min, t; for (

2、i=0; in-1; i+) /*要选择的次数:0n-2共n-1次*/ min = i; /*假设当前下标为i的数最小,比较后再调整*/ for (j=i+1; jn; j+)/*循环找出最小的数的下标是哪个*/ if (*(x+j) *(x+min) min = j; /*如果后面的数比前面的小,则记下它的下标*/ if (min != i) /*如果min在循环中改变了,就需要交换数据*/ t = *(x+i); *(x+i) = *(x+min); *(x+min) = t; /*=功能:直接插入排序输入:数组名称(也就是数组首地址)、数组中元素个数=*/void insert_sort

3、(int *x, int n)int i, j, t;for (i=1; i=0 & t0; h=k) /*循环到没有比较范围*/ for (j=0, k=0; j *(x+j+1) /*大的放在后面,小的放到前面*/ t = *(x+j); *(x+j) = *(x+j+1); *(x+j+1) = t; /*完成交换*/ k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/ /*=功能:希尔排序输入:数组名称(也就是数组首地址)、数组中元素个数=*/void shell_sort(int *x, int n)int h, j, k, t;for (h=n/2; h0;

4、h=h/2) /*控制增量*/ for (j=h; j=0 & t*(x+k); k-=h) *(x+k+h) = *(x+k); *(x+k+h) = t; /*=功能:快速排序输入:数组名称(也就是数组首地址)、数组中起止元素的下标=*/void quick_sort(int *x, int low, int high)int i, j, t;if (low high) /*要排序的元素起止下标,保证小的放在左边,大的放在右边。这里以下标为low的元素为基准点*/ i = low; j = high; t = *(x+low); /*暂存基准点的数*/ while (ij) /*循环扫描*

5、/ while (it) /*在右边的只要比基准点大仍放在右边*/ j-; /*前移一个位置*/ if (ij) *(x+i) = *(x+j); /*上面的循环退出:即出现比基准点小的数,替换基准点的数*/ i+; /*后移一个位置,并以此为基准点*/ while (ij & *(x+i)=t) /*在左边的只要小于等于基准点仍放在左边*/ i+; /*后移一个位置*/ if (ij) *(x+j) = *(x+i); /*上面的循环退出:即出现比基准点大的数,放到右边*/ j-; /*前移一个位置*/ *(x+i) = t; /*一遍扫描完后,放到适当位置*/ quick_sort(x,l

6、ow,i-1); /*对基准点左边的数再执行快速排序*/ quick_sort(x,i+1,high); /*对基准点右边的数再执行快速排序*/*=功能:堆排序输入:数组名称(也就是数组首地址)、数组中元素个数=*/*功能:渗透建堆输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始*/void sift(int *x, int n, int s)int t, k, j;t = *(x+s); /*暂存开始元素*/k = s; /*开始元素下标*/j = 2*k + 1; /*右子树元素下标*/while (jn) if (jn-1 & *(x+j) *(x+j+1)/*判

7、断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/ j+; if (t=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); /*剩下的数再建堆*/*构造随机输出函数类*/void input(int a)int i;srand( (unsigned int)time(NULL) );for (i = 0; i 4; i+) ai = rand() % 100;printf(n);/*构造键盘输入函数类*/*void

8、 input(int *p) int i; printf(请输入 %d 个数据 :n,MAX); for (i=0; iMAX; i+) scanf(%d,p+); printf(n);*/*构造输出函数类*/void output(int *p) int i; for ( i=0; iMAX; i+) printf(%d ,*p+); / 归并排序中的合并算法void Merge(int a, int start, int mid, int end) int i,k,j, temp110, temp210; int n1, n2; n1 = mid - start + 1; n2 = end

9、 - mid; / 拷贝前半部分数组 for ( i = 0; i n1; i+) temp1i = astart + i; / 拷贝后半部分数组 for (i = 0; i n2; i+) temp2i = amid + i + 1; / 把后面的元素设置的很大 temp1n1 = temp2n2 = 1000; / 逐个扫描两部分数组然后放到相应的位置去 for ( k = start, i = 0, j = 0; k = end; k+) if (temp1i = temp2j) ak = temp1i; i+; else ak = temp2j; j+; / 归并排序void Merg

10、eSort(int a, int start, int end) if (start end) int i; i = (end + start) / 2; / 对前半部分进行排序 MergeSort(a, start, i); / 对后半部分进行排序 MergeSort(a, i + 1, end); / 合并前后两部分 Merge(a, start, i, end); /*顺序查找*/void SequenceSearch(int *fp,int Length)int i;int data;printf(开始使用顺序查询.n请输入你想要查找的数据.n);scanf(%d,&data);for

11、(i=0;iLength;i+) if(fpi=data) printf(经过%d次查找,查找到数据%d,表中位置为%d.n,i+1,data,i); return ; printf(经过%d次查找,未能查找到数据%d.n,i,data);/*二分查找*/void Search(int *fp,int Length)int data; int bottom,top,middle; int i=0;printf(开始使用二分查询.n请输入你想要查找的数据.n);scanf(%d,&data);printf(由于二分查找法要求数据是有序的,现在开始为数组排序.n);Sort(fp,Length);

12、printf(数组现在已经是从小到大排列,下面将开始查找.n);bottom=0;top=Length;while (bottom=top) middle=(bottom+top)/2; i+; if(fpmiddledata) top=middle-1; else printf(经过%d次查找,查找到数据%d,在排序后的表中的位置为%d.n,i,data,middle); return; printf(经过%d次查找,未能查找到数据%d.n,i,data);void Sort(int *fp,int Length)int temp;int i,j,k;printf(现在开始为数组排序,排列结

13、果将是从小到大.n);for(i=0;iLength;i+) for(j=0;jfpj+1) temp=fpj; fpj=fpj+1; fpj+1=temp; printf(排序完成!n下面输出排序后的数组:n); for(k=0;kLength;k+) printf(%5d,fpk); printf(n);void main()int start=0,end=3;int *p, i, aMAX;int count=MAX;int arrMAX;int choise=0;/*printf(请输入你的数据的个数:n);scanf(%d,&count);*/* printf(请输入%d个数据n,c

14、ount);for(i=0;icount;i+) scanf(%d,&arri);*/*录入测试数据*/ input(a); printf(随机初始数组为:n); output(a); printf(n);do printf(1.使用顺序查询.n2.使用二分查找法查找.n3.退出n); scanf(%d,&choise); if(choise=1) SequenceSearch(a,count); else if(choise=2) Search(a,count); else if(choise=3) break; while (choise=1|choise=2|choise=3);/*录入

15、测试数据*/ 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);

16、/*录入测试数据*/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);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1