排序算法的C语言实现-快速排序
来源:互联网 发布:淘宝上靠谱的法国代购 编辑:程序博客网 时间:2024/05/21 07:49
快速排序是在实践中最快的已知排序算法,它的平均运行时间是O(NlogN),该算法之所以特别的快,主要是由于非常精炼和高度优化的内部循环。它的最坏情形的性能为N^2.
快速排序由下列简单的四步组成:
1.如果S中元素个数是0或1,则返回。
2.取S中任以元素V,称之为枢纽元
3.将S分成俩个不相交的集合,前一个元素都小于V,后一个元素都大于V。
4.返回quicksort(S1)后,加上V,再加上quicksort(S2);
如何选取枢纽元?
有一种安全的方法是随机选取枢纽元,但是产生随机数的代价是很昂贵的,减少不了算法其余部分的平均运行时间。
这里有种方法叫三数中值分割法,枢纽元最好的值是数组的中值,也就是第N/2个最大的数,但是这很难算出,而且严重减慢了算法的速度。那么退而求其次,我们用数组左端,中心,右端位置的中值来做枢纽元。
快速排序的交换策略是这样的:在开始之前将枢纽元和最后一个元素交换,让枢纽元离开要被排序的数组,因为数组排序完后,枢纽元的位置是一定的。i从第一个元素开始,j从倒数第二个元素开始,当i在j左边时,我们将i右移,移过那些小于枢纽元的元素,将j右移,移过那些大于枢纽元的元素。当i,j停止时,i指向一个大于枢纽元的元素,而j指向一个小于枢纽元的元素,这样做的效果最终是所有小于枢纽元的元素都在枢纽元左边,大于枢纽元的元素都在它的右边。从而达到了排序的意愿。
void quickSort(int a[],int length){Qsort(a,0,length-1);}int median3(int a[],int left,int right)//获得枢纽元,使用三数中值法{int center=(left+right)/2;if(a[left]>a[center])swap(&a[left],&a[center]);if(a[left]>a[right])swap(&a[left],&a[right]);if(a[center]>a[right])swap(&a[center],&a[right]);swap(&a[center],&a[right-1]);//将枢纽元放到数组最后return a[right-1];}void Qsort(int a[],int left,int right){int i,j;int pivot;if((left+3)<=right){pivot=median3(a,left,right);i=left,j=right-1;for(;;){while(a[++i]<pivot){}//因为第一次是a[i]小于pivot,a[j]是大于pivot,所以用++iwhile(a[--j]>pivot){}if(i<j)swap(&a[i],&a[j]);//出现等于的情况,交换,平均分配到子数组中elsebreak;}swap(&a[i],&a[right-1]);Qsort(a,left,i-1);//在i的位置之前,所有的元素都小于它,在i之后,所有的元素都大于它,所以A[i]的位置不需要变Qsort(a,i+1,right);}else//当数组很小的时候,只做插入排序,从而退出递归,不需要等到数组长度等于1的时候,因为对于小数组来说,插入排序好过快速排序insertionSort(a+left,right-left+1);//插入排序例程在前面的文章中已经实现了}
1 0
- 快速排序算法的c语言实现
- 快速排序算法的C语言实现
- 【算法】C语言实现的快速排序
- 快速排序算法的C语言实现
- 快速排序算法的C语言实现
- C语言快速排序算法的实现
- 快速排序算法的C语言实现
- 快速排序算法的C语言实现
- 排序算法的C语言实现-快速排序
- 快速排序C语言算法实现
- c语言实现快速排序算法
- 算法导论C语言实现: 快速排序
- 快速排序算法 C语言实现
- 直白快速排序算法,C语言实现
- C语言快速排序算法实现
- C语言实现数组快速排序算法
- C语言---快速排序算法实现
- C语言实现快速排序算法
- SPICE协议在Android上的几个优化要点
- python下载hadoop天气数据
- Android蓝牙开发
- adb常用命令总结
- 空格替换
- 排序算法的C语言实现-快速排序
- hdu 5358(尺取法)
- HDOJ066 一个人的旅行(dijkstra)
- innodb 添加 plugin_dir组件
- 空格替换2
- 微信开发中不出现“该公众号无法提供服务”
- UIWebView的用法
- 程序员将是人类最后一个被人工智能代替的工作
- sort命令详解