数据排序的几种方法c语言实现.doc_第1页
数据排序的几种方法c语言实现.doc_第2页
数据排序的几种方法c语言实现.doc_第3页
数据排序的几种方法c语言实现.doc_第4页
数据排序的几种方法c语言实现.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据排序的几种方法(c语言实现) /* 功能:用以下几种方法实现c语言中的常用排序 选择排序冒泡排序插入排序快速排序堆排序归并排序基数排序希尔排序*/ #include <stdio.h> void select_Sort1(int a,int n); void select_Sort2(int a,int n); void bubble_Sort(int a,int n); void insert_Sort(int a,int n); void quick_Sort(int a,int low,int high); int findpos(int a,int low,int high); int main() int a10; int i; printf("please enter ten int number:n"); for(i=0;i<10;i+) scanf("%d",&ai); /select_Sort2(a,10); /bubble_Sort(a,10); /insert_Sort(a,10); quick_Sort(a,0,9); printf("after sorted:n"); for(i=0;i<10;i+) printf("%5d",ai); return 0; /=第一种方法:选择排序法= /用一种较为容易理解的方法实现选择排序 void select_Sort1(int a,int n) int i,j,k; /外部循环从小到大,依次找出各位置上的值(最后一个位置上的值除外,因为在循环的过程中各个位置上的值逐渐确定下来,最后一个值自然就确定了) for(i=0;i<n-1;i+) /内部循环从外部循环指针的下一个位置开始,将后续位置上取到的值逐渐与外部循环所对应的指针上的值进行比较 for(j=i+1;j<n;j+) if(aj<ai) / 找到比该位置上的值小的值就进行一次交换 k=ai; ai=aj; aj=k; /以下方法实现起来效率更高,之所以效率高是因为找到一个比外循环指针所对应值更小的值时没有马上交换而是把位置先记录下来,内循环结束后再交换 void select_Sort2(int a,int n) int i,j,k,t; /外部循环从小到大,依次找出各位置上的值(最后一个位置上的值除外,因为在循环的过程中各个位置上的值逐渐确定下来,最后一个值自然就确定了) for(i=0;i<n-1;i+) /内部循环从外部循环指针的下一个位置开始,将后续位置上取到的值逐渐与外部循环所对应的指针上的值进行比较 k=i;/k的作用是记录内部指针一趟比较下来,哪个位置所对应的值比外指针所对应的值小,将该位置存放到k中,默认情况下k的值是外指针对应位置 for(j=i+1;j<n;j+) if(aj<ak) k=j;/k=j 记录下最小值的位置 /进行交换,t是临时变量 t=ai; ai=ak; ak=t; /=第二种方 法:冒泡排序法 = void bubble_Sort(int a,int n) int i,j,t; /外层循环控制圈数,对n个数排序,需要n-1圈 /外层循环指针对应将要放数的位置,每次结束外层循环都将排好了一个数 for(i=n-1;i>0;i-) /内层循环对相邻的俩个数进行比较,大者冒泡到后边,j<i使得内层循环不必再对已经排好的数进行访问 for(j=0;j<i;j+) if(aj>aj+1) t=aj; aj=aj+1; aj+1=t; /=第三种方法:插入法排序= void insert_Sort(int a,int n) int i,j,t; /外层循环的作用是从0位置开始逐渐从数组中将n个数拿出来,与已经排好的数进行比较,插入到适当的位置 for(i=0;i<n;i+) /对已有的数(这些数已经排好)逐一与外层循环拿出的数进行比较 /之所以j=i-1是因为i代表进行插入排序的数的位置,j就表示了排好序以后该有序数列最后一个数的位置 for(j=i-1;j>=0;j-) if(aj+1<aj) t=aj+1; aj+1=aj; aj=t; /=第四种方法:快速排序= /快速排序的原理是选择一个数作为分界点,将小于他的数放到他的左边,大于他的数放到他的右边,然后分别对左右俩边的数进行同样方法的处理,得出结果 void quick_Sort(int a,int low,int high) int pos; if(low<high) /确定一个位置pos,pos左边的数都比pos位置上的数小,pos右边的数都比pos位置上的数大 pos=findpos(a,low,high); quick_Sort(a,low,pos-1); quick_Sort(a,pos+1,high); /该方法的作用是返回一个位置值,使得该位置左边的数都比该位置上的数小,该位置右边的数都比该位置上的数大 int findpos(int a,int low,int high) /假定数组中的数为49,38,65,13,50之后便于进行说明 /从数组中选择一个数作为分界点,该数为49 int val=alow; while(low<high) /指针从high开始,将其值(即50)与val进行比较,若大于val,就移动high指针向前,再次比较,若小于val的值就将该值覆盖low指针位置处的值 while(low<high && ahigh>val) high-; alow=ahigh; /程序执行到这里后数列的排列顺序为13,38,65,13,50,此时 low和high指针的位置并没有互换 /指针从low开始,将其值(即13)与val进行比较,若小于val,就移动low指针向后,再次比较,若大于val的值就将该值覆盖high指针位置处的值 while(low<high && alow<val) low+; ahigh=alow; /程序执行到这里后数列的排列顺序为13,38,65,65,50,此时满足low小于high,进行下一次的循环 alow=val;/移动完毕low和high必定相等,此时的数列排列顺序为13,38,49,65,50,low=high=3 于是使得49左边的数都比49小,49右边的数都比49大 return low; /功能:归并排序,将俩个有序顺序表合并为一个有序顺序表。 #include <stdio.h> void mergesort(int a,int n1,int b,int n2); int main() int a5=0,2,4,6,8,b5=1,3,5,7,9; /合并俩表为一个有序表 printf("mergesortn"); mergesort(a,5,b,5); return 0; /合并俩个表为一个有序表 ,归并排序 void mergesort(int a,int n1,int b,int n2) int i,j,k; int c10; i=j=k=0; /按照俩表数据元素从小到大的顺序放到第三个数组中 while(i<n1 && j<n2) if(ai<bj) ck=ai; i+; k+; else ck=bj; j+; k+; /*上一次循环执行完毕,一个表中的数据元

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论