快排與一種優化

2021-09-11 18:33:06 字數 1004 閱讀 8077

快速排序(quick sort)是計算機領域乙個重要的演算法。

初學快排,理解起來並不難,核心理念主要是選取pivot軸心元素(選取pivot元素也有一定技巧,可能會影響到演算法的複雜度,需要多加揣摩),再從左向右尋找第乙個比pivot元素大的值,從右向左尋找第乙個比pivot元素小的值,當兩個「記號」都找到符合條件的值,將兩者交換位置。當兩個負責尋找的「記號」相遇,一輪迴圈結束。最後將記號相遇所在位置的值與pivot值再交換。這是整個序列被pivot值分成了兩個分割槽。接下來分別呼叫自身進行遞迴,對pivot左邊的全體序列與pivot右邊的全體序列進行相同處理。

整個演算法到此結束。基礎**如下:

void quicksort(int a, int left, int right)

a[left] = a[i]; 

a[i] = temp;

quicksort(a, left, i - 1); // left recursion

quicksort(a, i + 1, right); // right recursion

return;

}

但是這樣基礎的**並不穩定,需要進一步的優化。

這次的pivot值不在直接選取left,即最左邊第乙個值,而是使用(left+right)/2 所處位置的值。需要注意的是,改進的演算法核心在於while(i <= j)這個迴圈,記號i, j不在像是原演算法每次迴圈都從最左和最右遍歷,而是不斷的向前直到兩者相背(i > j),然後再進行遞迴,這樣在迴圈時比原演算法節省了時間,更加快速。

void quicksort(int a, int left, int right)

} if(i < right)

quicksort(a, i, right); // left recursion

if(j > left)

quicksort(a, left, j); // right recursion

return;

}

一種較為便捷的快排寫法

思維 通過設定哨兵a low 從a low 1 到a high 依次與a low 進行比較,最終目的是使哨兵左邊部分元素都比哨兵元素小,右邊部分元素都比哨兵元素大。然後對左右兩部分分別進行遞迴呼叫,最終實現所有元素的排序。ps 此處是通過自增指標cur,將low之後比哨兵元素小的元素全部交換到前面部...

NYOJ 8 一種排序 快排

快排,注意題意要求就可以了。時間限制 3000 ms 記憶體限制 65535 kb難度 3 描述 現在有很多長方形,每乙個長方形都有乙個編號,這個編號可以重複 還知道這個長方形的寬和長,編號 長 寬都是整數 現在要求按照一下方式排序 預設排序規則都是從小到大 1.按照編號從小到大排序 2.對於編號相...

快排及優化

快速排序的本質就是選取乙個基準數,通過一次快排把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了基準數在陣列中的正確位置。然後可以用遞迴的方式分別對前半部分和後半部分排序,最終實現整體陣列有序。所謂排序的穩定性,就是指在排序過程中,在對某關鍵字排序後會不會改變其他關鍵字的順...