快速排序 基準定位,分而治之

2021-08-03 00:05:37 字數 2091 閱讀 4779

快速排序的思想

快速是這個演算法的特點,所以為了效率出現頻度也會很高。快速排序:基準元素+二分思想,分治的標準是相比於基準元素值的大小(比如相比於基準元素大的放右邊,小的放左邊),分治思想的執行提高了執行效率。

快速排序**

public

class

quicksort ;

//實現排序的方法

quicksort(sum,0,sum.length-1);

//迴圈輸出

for (int i: sum)

}/**

* 分治方法的遞迴實現

*@param attr 需要排序的陣列

*@param left 最左邊元素下標

*@param right 最右邊元素下標

*/public

static

void

quicksort(int attr, int left, int right)

/*** 歸位基本元素,返回劃分元素的位置

*@param attr 劃分的陣列

*@param left 最左元素下標

*@param right 最右元素下標

*@return 返回歸位的位置

*/public

static

intpartition(int attr, int left, int right)

}//待比較元素不大於2,即兩元素比較的位置相遇了,置換基準元素到相遇的位置,完成歸位

attr[left] = attr[j];

attr[j] = sign;

//返回歸位的位置

return j;

}}

快速排序的時間複雜度

1.快速排序每次將待排序陣列二分為兩個部分,在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。

2.在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o(nlogn),最壞情況為o(n^2)。

3.在實際應用中,快速排序的平均時間複雜度為o(nlogn)。優於氣泡排序,在各大演算法中算是時間較小的。

快速排序的穩定性

在基準元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,比如序列5 3 3 4 3 8 9 10 11,現在中樞元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是乙個不穩定的排序演算法。

總結

可以看到,快速排序的**量與氣泡排序相比,龐大了不少,思路就是不斷的實現二分和歸位目標元素,來完成整個排序演算法,遞迴的使用讓我們不必再擔心迴圈的次數了。

挖坑排序

挖坑排序也算是快速排序,相比快速排序,**量縮減很多。挖坑排序的思想也是分治+遞迴+基準元素歸位實現的,但是挖坑是順序填補元素的,也就是目標元素順序填補從所給資料倒序符合的元素,反過來同理倒序填補所給元素順序查詢符合的元素。可以看到**量也是比較簡短的。

挖坑排序**

public

class

quick ;

//實現排序的方法

quick_sort(sum,0,sum.length-1);

//迴圈輸出

for (int i: sum)

}/**

*@param s 目標陣列

*@param l 要排序陣列最左元素下標

*@param r 要排序陣列最右元素下標

*/static

void quick_sort(int attr, int l, int r)

//基準元素歸位

attr[i] = sign;

quick_sort(attr, l, i - 1); // 遞迴呼叫

quick_sort(attr, i + 1, r);

} }

}

詳細**介紹請參考大神博文:

基準數 快速排序

問題 對 6 1 2 7 9 3 4 5 10 8 十個數進行排序 首先選乙個基準數,為了方便,我們就選第乙個數6作為準基數吧。我們想把準基數6放到它準確的位置,就是排序好後的位置 我們想把比6小的都放在6的左邊,比6大的都放在6的右邊,那麼6的位置就排序好了 我們假設序列兩端都有乙個箭頭,乙個從左...

排序(三) 快速排序 選取不同位置基準數

1 i l j r 將基準數挖出形成第乙個坑a i 2 j 由後向前找比它小的數,找到後挖出此數填前乙個坑a i 中。3 i 由前向後找比它大的數,找到後也挖出此數填到前乙個坑a j 中。4 再重複執行2,3二步,直到i j,將基準數填入a i 中。include include using nam...

04 第四章 快速排序(分而治之)

本章內容 目錄 分而治之 快速排序 再談大o表示法 分而治之並非可用於解決問題的演算法,而是一種解決思路。使用分而治之策略解決問題的過程包括兩個步驟 找出基線條件,這種條件必須盡可能簡單。不斷將問題分解 或者說是減小規模 直到符合基線條件 例項一 比如編寫求解乙個數字陣列之和的函式 第一步,找到基線...