快速排序之單項掃描法

來源:互聯網
上載者:User

標籤:style   blog   http   color   java   os   io   for   資料   

快速排序是排序演算法中最受青睞的演算法之一,相對於堆排序和歸併排序而言,即便具有相同的複雜度O(NlogN)。面對大資料而言,快排的效率也更高。一般而言,資料結構中的排序演算法都是採取的雙向指標法。在之前寫的一篇博文《排序演算法(初級版)之快排、歸併、堆排序》中已經有過總結。這裡就不再囉嗦了。

本篇博文主要講一下,快拍的單項掃描實現,可以實現對鏈表的快拍。同時,本演算法可以高效的解決《劍指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小/大的元素”

 1     public int findKSmallEle(int[] a,int k){ 2         if(k >= a.length || k < 0) return -1; 3         qSelect(a, k, 0, a.length - 1); 4         return a[k]; 5     } 6      7     private void qSelect(int[] a,int k ,int q,int r){ 8         if(q < r){ 9             int index = partition(a, q, r);10             if(index > k){11                 qSelect(a, k, q, index - 1);12             }else if(index < k){13                 qSelect(a, k, index + 1, r);14             }else15                 return;16         }17     }

 

 

快速排序之單項掃描法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.