快速排序相關(學習筆記)

2022-06-21 09:48:10 字數 1676 閱讀 9282

1)快排的原理是什麼?快速寫一段核心**實現。

a.快速排序的原理解釋

首先,在符合遞迴條件下進行

其次,得到基準元素位置

①從數列中取出第乙個數作為基準元素

②實現元素的移動(比基準元素大的放右邊,小於或等於放左邊)

方法一:挖坑填數,選定基準元素pivot,並記住位置index(坑位),並且設定兩個指標right和left,在上面的分割槽過程中,符合條件能夠左右置換的,被比較的數將坑位填滿,自己成為下乙個坑位,繼續比較下去,直到right和left重合在了同一位置,再將pivot元素放置到index,並得到基準元素位置。

方法二:指標交換法,控制指標、進行比較、判斷是否需要移動、交換指標指向的元素,right和left重合,pivot元素替換,得到基準元素位置。

最後,再對左右區間進行遞迴。

b.快速寫一段核心**實現:

public

static

void quicksort(int arr, int right, int

left)

int i = right, j = end, pivot = arr[(right + left) / 2];

while (i <=j)

while (arr[j] >pivot)

if (i else

if (i ==j)

}quicksort(arr, right, j);

quicksort(arr, i, left);

}}

2) dualpivotquicksort的sort**實現int排序的原理和關鍵步驟

因為數列的特徵不同,利用快速排序時基準元素的選擇會直接影到響最終的效果。經過對陣列具體情況的多重考量和細分,得出先對int陣列進行測試,再選擇合適的排序方法,才能真正的提高效率。

dualpivotquicksort的sort**實現int排序的原理和關鍵步驟:

1. 判斷陣列int a的長度是否大於常量286(quicksort_threshold)

若right-left 2.判斷陣列inta的長度是否大於常量47(insertion_sort_threshold)

若right-left < insertion_sort_threshold,使用插入排序。

3.判斷該陣列inta是否已經高度結構化(即已經接近排序完成):

檢查陣列是不是已經接近有序狀態:a.否(有序數列的個數超過了max_run_count),使用快速排序;b.是,判斷該陣列是否已經排列好,沒有的話使用歸併排序。

4.在上述情況都不滿足的情況下,使用雙基準快速排序演算法進行排序。

思路和上面快速排序差不多,不同的是要選取兩個pivot(p1、p2)和部分演算法的優化處理。

系統通過位運算int seventh = (length >> 3) + (length >> 6) + 1;獲取陣列長度的1/7的近似值;之後獲取本陣列中間位置的索引e3(int e3 = (left + right) >>> 1; // the midpoint);在中間位置的左右1/7, 2/7處各獲取兩個索引(e2, e1, e4, e5);再獲取四個索引,將這五個索引對應的值用插入演算法進行排序, 再放回五個索引的位置;對索引值進行排序,判斷五個索引對應的元素值是否相同,不相同時,使e2的值作為pivot1, e4的值作為pivot2,進行雙基準快速排序,相同時選取e3的值作為pivot,進行單基準快速排序。

快速排序學習筆記

學習資料出處 白話經典演算法系列之六 快速排序 快速搞定 快速排序採用分治策略,其基本思想 1 從數列中選乙個元素x作為基準數 2 分割槽過程,把不小於x的元素放到x的右邊,小於x的元素放到x的左邊 3 再對左右區間重複進行分割槽操作,直到各區間只有乙個數 morewindows總結的 挖坑填數 分...

學習筆記 快速排序

基本步驟 1 確定分界點x a l a r a l r 1 2 劃分區間 小於x的在一邊,大於x的在另一邊 3 遞迴處理左右兩端 const int n 1e5 5 int n,a n void quick sort int a,int l,int r quick sort a,l,j quick ...

學習筆記 快速排序

將乙個一維陣列從小到大排列。快速排序利用了遞迴的思想。需要三個引數,陣列本身,陣列起始索引也就是0,陣列最右索引,也就是陣列長度 1。簡單來說,快速排序的思想是這樣的,先選擇乙個數作為基準數,把比它小的都移動到左邊,把比它大的都移動到右邊,然後針對左邊這個子陣列,再選擇乙個基準數,比它小的移到左邊,...