快速排序之单项扫描法
2014-08-22 17:00
183 查看
快速排序是排序算法中最受青睐的算法之一,相对于堆排序和归并排序而言,即便具有相同的复杂度O(NlogN)。面对大数据而言,快排的效率也更高。一般而言,数据结构中的排序算法都是采取的双向指针法。在之前写的一篇博文《排序算法(初级版)之快排、归并、堆排序》中已经有过总结。这里就不再啰嗦了。
本篇博文主要讲一下,快拍的单项扫描实现,可以实现对链表的快拍。同时,本算法可以高效的解决《剑指offer》中的“寻找最小k个数”
以下内容主要摘自《算法导论》:
本算法将待排序数组array分成四部分:比pivot小的,比pivot大的,尚未扫描的,pivot:
算法过程如下:
具体实现:
如此看来单向扫描法具体的实现起来并不比双向扫描复杂,同时适应性更广;
下面再利用partition实现一下,O(n)复杂度找到“前k小/大的元素”
本篇博文主要讲一下,快拍的单项扫描实现,可以实现对链表的快拍。同时,本算法可以高效的解决《剑指offer》中的“寻找最小k个数”
以下内容主要摘自《算法导论》:
本算法将待排序数组array分成四部分:比pivot小的,比pivot大的,尚未扫描的,pivot:
算法过程如下:
具体实现:
public void qSort(int[] a,int begin,int end){ if(begin >= end) return; int mid = partition(a, begin, end); qSort(a, begin, mid - 1); qSort(a, mid + 1, end); } public int partition(int[] a,int p ,int r){ int x = a[r]; int i = p - 1; int j = p; for(j = p; j < r; j++){ if(a[j] < x){ i++; swap(a, i, j); } } swap(a, i + 1, j); return i + 1; }
如此看来单向扫描法具体的实现起来并不比双向扫描复杂,同时适应性更广;
下面再利用partition实现一下,O(n)复杂度找到“前k小/大的元素”
public int findKSmallEle(int[] a,int k){ if(k >= a.length || k < 0) return -1; qSelect(a, k, 0, a.length - 1); return a[k]; } private void qSelect(int[] a,int k ,int q,int r){ if(q < r){ int index = partition(a, q, r); if(index > k){ qSelect(a, k, q, index - 1); }else if(index < k){ qSelect(a, k, index + 1, r); }else return; } }
相关文章推荐
- 快速排序Java(指针双向从头尾向中间扫描)
- 快速排序--双边扫描与单边扫描的实现
- 笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- 快速排序详细分析--单向扫描和双向扫描
- 从排序开始(四)快速排序
- PHP利用ICU扩展intl快速实现汉字转拼音以及按拼音首字母分组排序
- 快速排序(方式一)
- 快速排序 [Qsort]
- 快速排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- 经典算法之快速排序
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 快速排序partition过程常见的两种写法+快速排序非递归实现
- 多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(4)编码过程——排序扫描
- 快速排序
- 3.快速排序——啊哈算法java实现
- 快速排序
- C语言快速排序实现
- 基础排序算法 – 快速排序Quick sort