分治思想的应用之快速排序
2014-09-20 22:44
239 查看
快速排序算法与归并排序很像,都是分治的思想。不同点在于归并排序算法是通过位置下区分两个区间,而快速排序算法是用值来区分两个区间。所以归并排序算法还需要合并的操作,而快速排序则不需要。
快速排序算法最核心的地方在于:在区间中选择一个值pivot,让大于pivot的都在它的一边,而让小于pivot的都在另一边。
第一步:把idx左边的第一个大于pivot的数填到idx的位置,然后得到新的坑,记为idx。
第二步:把idx右边的第一个小于pivot的烽填到idx的位置,然后也得到新的坑,记为idx。
不停的重复以上两步,直到i>j。
然后就得到快速排序算法了,代码如下:
快速排序算法最核心的地方在于:在区间中选择一个值pivot,让大于pivot的都在它的一边,而让小于pivot的都在另一边。
private static int partititon(int[] a,int l,int r){ int idx = mid3(a,l,(l+r)/2,r); int pivot = a[idx]; //a[idx]的位置已经空了下来 int i=l,j=r; while(i<j){ while(i<idx&&a[i]<=pivot)i++; if(i<j){ a[idx]=a[i];idx=i; } while(j>idx&&a[j]>=pivot)j--; if(i<j){ a[idx]=a[j];idx=j; } } a[idx]=pivot; return idx; }区间中选择pivot是有技巧的。一般取左中右三个位置的数中,大小排在中间的那个数。
private static int mid3(int[] a,int l,int m,int r){ return a[l]<a[m]? (a[m]<a[r]? m : a[l]<a[r]? r:l ): ( a[m]>a[r]? m : a[l]>a[r]?r:l); }这个过程有点像填坑。首先选择pivot,把它的值空出来,它的位置记为idx。接下来就按照下面的步骤进行:
第一步:把idx左边的第一个大于pivot的数填到idx的位置,然后得到新的坑,记为idx。
第二步:把idx右边的第一个小于pivot的烽填到idx的位置,然后也得到新的坑,记为idx。
不停的重复以上两步,直到i>j。
然后就得到快速排序算法了,代码如下:
public static void quickSort(int[] a,int l,int r){ if(l<r){ int paridx = partititon(a,l,r); quickSort(a,l,paridx-1); quickSort(a,paridx+1,r); } }非常简单。整个过程都没有明显的排序,却一直在排序。算法虽易,思想不易。且学且珍惜!
相关文章推荐
- 分治思想的应用:C++实现快速排序和随机化的快速排序
- 分治思想的应用
- <菜鸟学算法-A排序(分治的思想:快速排序)>
- 最近点对问题(分治思想的经典应用)
- 062day(分治思想在归并排序上的应用)
- 算法之分治思想和快速排序
- 分治思想的应用2
- 分治思想之快速排序
- 分治思想:合并排序和快速排序
- 分治思想的应用
- 分治思想的应用之——二分法
- 快速排序(递归与分治的思想)
- Java使用分治递归的思想实现快速排序
- 递归和分治思想的典型应用—汉诺塔问题
- 分治思想应用:归并排序
- 递归和分治思想的典型应用—汉诺塔问题
- 算法分析——分治思想之快速排序
- 分治思想在查询中的应用
- 快速排序原理解析及实例应用
- 【原创】CSSOO的思想及CSS框架的应用(未整理完)