快速排序的精髓就在partition
函式的實現。我們構建兩個指標,將陣列分為三部分,黑色部分全部小於pivot
,中間藍色部分都大於pivot
,後面紅色部分未知。i
指標遍歷整個陣列,只要它指向的元素小於pivot
就交換兩個指標指向的元素,然後遞增。
// arr為陣列,start、end分別為陣列第乙個元素和最後乙個元素的索引
// povitindex為陣列中任意選中的數的索引
intpartition(int arr, int start, int end, int pivotindex)
}swap(arr[storeindex], arr[end]);
return storeindex;
}
兩次swap
是為了將pivot
先暫存在最後乙個位置,在完成一次partition
之後將pivot
還原至storeindex
所指的位置。因為它之前的元素都小於它,之後的都大於它。
如果沒有這兩次swap
,那麼storeindex
將指向大於等於pivot
的元素,並不能保證它之後的元素都大於pivot
(能保證之前的都是小於的)。storeindex
位置的元素一旦固定直至程式結束將不會再改變,因此需要使用兩次交換暫存pivot
元素。
快速排序演算法裡的partition函式
快速排序演算法裡的partition函式用來解決這樣乙個問題 給定乙個陣列arr和陣列中任意乙個元素a,重排陣列使得a左邊都小於它,右邊都不小於它。實現 arr為陣列,start end分別為陣列第乙個元素和最後乙個元素的索引 povitindex為陣列中任意選中的數的索引 int partitio...
Partition函式實現的快速排序演算法
被傳值傳引用的問題還有一些雜事困擾了一下午,現在終於可以靜下心來寫部落格了。這個partition函式是我在 劍指offer 那本書上看到的,其實對應於快排是乙個單項掃瞄。這個函式在很多演算法題上都有應用,主要原理就是選定乙個參考值,然後將資料分成兩部分,左邊都是比它小的,右邊都是比它大的。然後把中...
快速排序 一次遍歷partition的實現
一種partition的實現如下 1 private int partition int array,int left,int right 14 1516 int tem array i 1 17 array i 1 array right 18 array right tem 1920 retur...