快速排序實現心得及STL中sort原始碼理解

2021-10-04 12:56:18 字數 1088 閱讀 5119

快排基本思路:

主元選擇,這裡直接選擇第乙個元素作為主元,可能導致時間複雜度為o(n),通常會從begin,mid,end選擇中間元素做主元,同時對這三個元素進行排序(類似希爾排序)

雙指標,將主元放在一邊,這裡將主元放在第乙個元素(即位置不變),兩個指標start和last,start為從begin+1開始從前往後走的指標,last為從end開始從後往前的指標。

遍歷,start找到第乙個大於主元的元素,end找到第乙個小於主元的元素,交換兩者位置。迴圈直到start大於last。

主元歸位,跳出迴圈後,找到主元應該在的位置。

遞迴,對主元前的資料段進行快排,主元後的資料段進行快排

void

quicksort

(vector<

int>

& nums,

int begin,

int end)

swap

(nums[idx]

, nums[end]);

quicksort

(nums, begin, idx-1)

;quicksort

(nums, idx+

1, end);}

}

其中幾個tips

原始碼中_isort_max是常量32,排序長度大於32時,會先進行快速排序,並用_ideal引數限制快速排序遞迴呼叫的深度。每次while迴圈都會執行_ideal = _ideal*3/4。由於初始_ideal值為排序長度n,所有限制的深度實際為log(3/4)n。

當進行完一次快速排序,會將主元前後更短的資料進行遞迴呼叫,而更長的資料段用while迴圈進行處理

當多次遞迴呼叫快速排序且ideal減小為0,若此時需要排序的資料段長度仍大於32時,就會呼叫堆排序,若在[2,32]之間,就會使用插入排序

個人的一些觀點,有錯誤歡迎指正

快速排序及c 實現

乙個暑假的閒暇,玩的是舒服了,可是腦子裡的各種演算法卻忘了,果然程式設計是個靠保持狀態的活,昨天覆習了便快排,拿出來寫個部落格加深個印象。簡介 快排是基於分治模式的,它的平均時間複雜度為o nlgn 最壞複雜度是o n n 思想 快排的其基本思想是,陣列中先隨機找個主元 pivot element ...

快速排序及C 實現

1.挑選乙個基準值 2.小於基準值的數放在大於基準值的數的左邊 3.將基準值放入中間,即兩種數分界的地方,根據挑選的基準值決定如何插入。4.此時,基準值左邊的區間小於等於基準值,基準值小於等於右邊的區間,這三段有序,但內部無序,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1。是乙個遞迴的過...

快速排序原理及實現

快速排序的步驟 從陣列中選擇乙個基準數 選擇哪乙個沒有關係,為了方便一般選第乙個或者最後乙個,也可以隨機選擇 把小於基準數的數移動到基準數左邊,大於基準數的數移動到基準數右邊,和基準值相同的數可以放到任意一邊。此時,基準數左邊的所有值都小於右邊的任意值。對於左右兩邊的子陣列,重複以上操作,直到陣列有...