欢迎来到天天文库
浏览记录
ID:42615317
大小:37.50 KB
页数:8页
时间:2019-09-18
《c语言经典排序算法(8种-含源代码)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、c语言经典排序算法(8种-含源代码).txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。多么忙不重要,为什么忙才重要。天行健,君子以自强不息常见经典排序算法1.希尔排序2.二分插入法3.直接插入法4.带哨兵的直接排序法5.冒泡排序6.选择排序7.快速排序8.堆排序一.希尔(Shell)排序法(又称宿小增量排序,是1959年由D.L.Shell提出来的)/*Shell排序法*/#includevoidsort(intv[],intn){intgap,i,j,temp;for(gap=n/2;gap>0;gap/=2)/*设置排序的步
2、长,步长gap每次减半,直到减到1*/{for(i=gap;i=0)&&(v[j]>v[j+gap]);j-=gap)/*比较相距gap远的两个元素的大小,根据排序方向决定如何调换*/{temp=v[j];v[j]=v[j+gap];v[j+gap]=temp;}}}}二.二分插入法/*二分插入法*/voidHalfInsertSort(inta[],intlen){inti,j,temp;intlow,high,mid;for(i=1;i3、保存但前元素*/low=0;high=i-1;while(low<=high)/*在a[low...high]中折半查找有序插入的位置*/{mid=(low+high)/2;/*找到中间元素*/if(a[mid]>temp)/*如果中间元素比但前元素大,当前元素要插入到中间元素的左侧*/{high=mid-1;}else/*如果中间元素比当前元素小,但前元素要插入到中间元素的右侧*/{low=mid+1;}}/*找到当前元素的位置,在low和high之间*/for(j=i-1;j>high;j--)/*元素后移*/{a[j+1]=a[j];}a[hig4、h+1]=temp;/*插入*/}}三.直接插入法/*直接插入法*/voidInsertionSort(intinput[],intlen){inti,j,temp;for(i=1;i-1&&input[j]>temp;j--)/*从当前元素的上一个元素开始查找合适的位置*/{input[j+1]=input[j];/*一边找一边移动元素*/input[j]=temp;}}}四.带哨兵的直接排序法/***带哨兵的直接插入排序,数组的第一个元素5、不用于存储有效数据*将input[0]作为哨兵,可以避免判定input[j]中,数组是否越界*因为在j--的过程中,当j减小到0时,变成了input[0]与input[0]*自身进行比较,很明显这个时候说明位置i之前的数字都比input[i]小*位置i上的数字不需要移动,直接进入下一轮的插入比较。**/voidInsertionSortWithPiquet(intinput[],intlen){inti,j;for(i=2;i6、ut[i];for(j=i-1;input[j]>input[0];j--){input[j+1]=input[j];input[j]=input[0];/*input[j]一直都是排序的元素中最大的那一个*/}}}五.冒泡法/*冒泡排序法*/voidBublesort(inta[],intn){inti,j,k;for(j=0;ja[i+1])/*把值比较大的元素沉到底*/{k=a[i]7、;a[i]=a[i+1];a[i+1]=k;}}}}六.选择排序法/*算法原理:首先以一个元素为基准,从一个方向开始扫描,*比如从左至右扫描,以A[0]为基准。接下来从A[0]...A[9]*中找出最小的元素,将其与A[0]交换。然后将基准位置右*移一位,重复上面的动作,比如,以A[1]为基准,找出*A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位*置移到数组最后一个元素时排序结束(此时基准左边所有元素*均递增有序,而基准为最后一个元素,故完成排序)。*/voidSelectsort(intA[],intn){inti,j,min,te8、mp;for(i=0;i
3、保存但前元素*/low=0;high=i-1;while(low<=high)/*在a[low...high]中折半查找有序插入的位置*/{mid=(low+high)/2;/*找到中间元素*/if(a[mid]>temp)/*如果中间元素比但前元素大,当前元素要插入到中间元素的左侧*/{high=mid-1;}else/*如果中间元素比当前元素小,但前元素要插入到中间元素的右侧*/{low=mid+1;}}/*找到当前元素的位置,在low和high之间*/for(j=i-1;j>high;j--)/*元素后移*/{a[j+1]=a[j];}a[hig
4、h+1]=temp;/*插入*/}}三.直接插入法/*直接插入法*/voidInsertionSort(intinput[],intlen){inti,j,temp;for(i=1;i-1&&input[j]>temp;j--)/*从当前元素的上一个元素开始查找合适的位置*/{input[j+1]=input[j];/*一边找一边移动元素*/input[j]=temp;}}}四.带哨兵的直接排序法/***带哨兵的直接插入排序,数组的第一个元素
5、不用于存储有效数据*将input[0]作为哨兵,可以避免判定input[j]中,数组是否越界*因为在j--的过程中,当j减小到0时,变成了input[0]与input[0]*自身进行比较,很明显这个时候说明位置i之前的数字都比input[i]小*位置i上的数字不需要移动,直接进入下一轮的插入比较。**/voidInsertionSortWithPiquet(intinput[],intlen){inti,j;for(i=2;i6、ut[i];for(j=i-1;input[j]>input[0];j--){input[j+1]=input[j];input[j]=input[0];/*input[j]一直都是排序的元素中最大的那一个*/}}}五.冒泡法/*冒泡排序法*/voidBublesort(inta[],intn){inti,j,k;for(j=0;ja[i+1])/*把值比较大的元素沉到底*/{k=a[i]7、;a[i]=a[i+1];a[i+1]=k;}}}}六.选择排序法/*算法原理:首先以一个元素为基准,从一个方向开始扫描,*比如从左至右扫描,以A[0]为基准。接下来从A[0]...A[9]*中找出最小的元素,将其与A[0]交换。然后将基准位置右*移一位,重复上面的动作,比如,以A[1]为基准,找出*A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位*置移到数组最后一个元素时排序结束(此时基准左边所有元素*均递增有序,而基准为最后一个元素,故完成排序)。*/voidSelectsort(intA[],intn){inti,j,min,te8、mp;for(i=0;i
6、ut[i];for(j=i-1;input[j]>input[0];j--){input[j+1]=input[j];input[j]=input[0];/*input[j]一直都是排序的元素中最大的那一个*/}}}五.冒泡法/*冒泡排序法*/voidBublesort(inta[],intn){inti,j,k;for(j=0;ja[i+1])/*把值比较大的元素沉到底*/{k=a[i]
7、;a[i]=a[i+1];a[i+1]=k;}}}}六.选择排序法/*算法原理:首先以一个元素为基准,从一个方向开始扫描,*比如从左至右扫描,以A[0]为基准。接下来从A[0]...A[9]*中找出最小的元素,将其与A[0]交换。然后将基准位置右*移一位,重复上面的动作,比如,以A[1]为基准,找出*A[1]~A[9]中最小的,将其与A[1]交换。一直进行到基准位*置移到数组最后一个元素时排序结束(此时基准左边所有元素*均递增有序,而基准为最后一个元素,故完成排序)。*/voidSelectsort(intA[],intn){inti,j,min,te
8、mp;for(i=0;i
此文档下载收益归作者所有