三路快速排序
2017-03-20 18:04
176 查看
快速排序
普通快速排序在多数值==v的情况下,表现不佳。原因在于part左右分配不均,引发退化。优化后,会将==v部分part左右平分,消除影响,但仍然不是最佳之选。
三路快速排序实现
void quickSort3Ways(Integer[] arr, int l, int r)
三路排序将数组分成三个部分 >v,==v,等于v。遍历元素
当e==v
当e<v
当e>v
交换之后,i虽然不需要变大,但是gt需要减1维护>v的结构
初始化
当i==gt的时候遍历结束
交换标准元素v
普通快速排序在多数值==v的情况下,表现不佳。原因在于part左右分配不均,引发退化。优化后,会将==v部分part左右平分,消除影响,但仍然不是最佳之选。
/** * 快速排序优化 */ public class QuickSortFast { public static void sort(Integer[] arr){ Integer n = arr.length; quickSort(arr,0,n-1); } private static void quickSort(Integer[] arr, int l, int r) { if(r-l<=15){ InsertionSort.sort2(arr,l,r); return; } int p = partition(arr,l,r); quickSort(arr,l,p-1); quickSort(arr,p+1,r); } // 返回p,使得arr[l...p-1]<arr[p]; arr[p+1...r]>arr[p] private static int partition(Integer[] arr, int l, int r) { // 随机选取标定元素 Tlt.exch(arr,l,StdRandom.uniform(l, r)); Integer v = arr[l]; // arr[l+1...i) <= v; arr[j...r] >= v int i = l+1,j = r; while(true){ while(i <=r && arr[i]<v) i++; while(j >= l+1 && arr[j]>v) j--; if(i>j)break; Tlt.exch(arr,i,j);// 这种情况在arr[i]=v=arr[j]的情况下也会交换。但是好在将等于v的数据在part两部分平分了,阻止退化成on^2。 i++; j--; } Tlt.exch(arr,l,j); return j; } public static void main(String[] args) { Integer[] random = Tlt.random(100000, 0, 100000); sort(random); Tlt.show(random); } }
三路快速排序实现
/** * 三路快速排序 */ public class QuickSort3Ways { public static void sort(Integer[] arr){ Integer n = arr.length; quickSort3Ways(arr,0,n-1); } private static void quickSort3Ways(Integer[] arr, int l, int r) { if(r-l<=15){ InsertionSort.sort2(arr,l,r); return; } Tlt.exch(arr,l,StdRandom.uniform(l, r)); Integer v = arr[l]; int lt= l; // arr[l+1...lt] < v int gt = r+1; // arr[gt...r] > v int i = l+1; // arr[lt+1...i] == v while(i<gt){ if(arr[i] < v){ Tlt.exch(arr,i,lt+1); lt++; i++; }else if(arr[i]>v){ Tlt.exch(arr,i,gt-1); gt--; }else{ i++; } } Tlt.exch(arr,l,lt); quickSort3Ways(arr,l,lt-1);//不考虑==v部分 quickSort3Ways(arr,gt,r);//不考虑==v部分 } public static void main(String[] args) { Integer[] random = Tlt.random(100000, 0, 100000); sort(random); Tlt.show(random); } }
void quickSort3Ways(Integer[] arr, int l, int r)
三路排序将数组分成三个部分 >v,==v,等于v。遍历元素
当e==v
当e<v
当e>v
交换之后,i虽然不需要变大,但是gt需要减1维护>v的结构
初始化
当i==gt的时候遍历结束
交换标准元素v
相关文章推荐
- 快速排序及优化(三路划分等)
- 快速排序优化(三路快排)
- 挖掘算法中的数据结构(三):O(n*logn)排序算法之 快速排序(随机化、二路、三路排序) 及衍生算法
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 【算法——Python实现】快速排序的优化:三路快速排序及Leetcode题目应用
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 快速排序(单,双,三路)
- 快速排序(2)算法改进--小的子文件、三者取中、重复关键字三路划分
- 排序算法之三路划分的快速排序
- php 冒泡排序和快速排序
- 排序算法-快速排序
- Scala插入排序、归并排序、快速排序
- Java快速排序
- 趣味编程:函数式链表的快速排序(参考答案)
- 快速排序
- 快速排序
- 链表的归并排序与快速排序
- 快速排序(quicksort)
- 常用算法Java实现之快速排序
- 快速排序