排序演算法 2 快速排序 Quick Sort

2021-09-24 10:56:40 字數 1195 閱讀 1135

相比於氣泡排序演算法,快速排序要快的多,一般情況下氣泡排序的時間複雜度是o(n²),而快速排序平均時間複雜度為o(nlogn),可以說是在所有交換排序中時間複雜度最低的乙個;但是在個別情況下也會達到和氣泡排序同等的時間複雜度,比如待排序的元素中用於排序的關鍵字全部相等,或者已經按照完全有序排列,這時候快速排序演算法的時間複雜度可能會達到最差o(n²);

每次從待排序的元素中取出乙個元素作為基準數;

分別從序列的兩邊遍歷序列,(使用leftpoint 表示從左邊遍歷序列時指向的當前遍歷元素的索引值,使用rightpoint表示從右邊遍歷序列時指向的當前遍歷元素的索引值,有些資料結構和演算法書裡也稱之為兩個哨兵);

當rightpoint和leftpoint 未相遇時,分別前進(leftpoint 向找,rightpoint 向前找) 直到rightpoint 遇到乙個比基準數大且leftpoint 遇到乙個比基準數小的值停止,此時交換rightpoint 和leftpoint 指向的值;

按照步驟三一直查詢,查詢結束後將基準數歸位,此時將得到這樣乙個序列,基準書左邊的值都比基準數小,基準數右邊的值都比基準數大,經過這樣一趟排序最終能確定基準數在結果有序序列中的準確的位置;

排序一趟過後,將原序列按照上一輪確定的基準數劃分為左序列和右序列,然後分別按照上面的步驟給左序列和右序列排序(從**實現上看就是用遞迴來來實現這個過程);

public static void quicksort(int array,int l,int r)

// 從左向右遍歷尋找乙個比基準數大的值

while (array[leftpoint] <= baseelement && leftpoint < rightpoint)

if (leftpoint < rightpoint)

// leftpoint != rightpoint 繼續查詢

}swap(array, leftpoint, l); // 將基準數歸位

// 將序列一分為二 分別對基準數左右兩邊的序列繼續排序

quicksort(array,l,leftpoint - 1);

quicksort(array,rightpoint + 1,r);

}

public static void swap(int array, int a,int b)

排序演算法(2)快速排序

採用分治思想 1 從序列中挑出乙個元素作為 基準 privot 2 把所有比基準小的元素放在基準前面,把所有比基準大的元素放在基準後面,這個操作稱為 分割槽 3 對每個分割槽遞迴的進行 1 2 遞迴結束的條件是序列的大小是0或1 分類 內部比較排序 資料結構 陣列 最差時間複雜度 每次選取的基準都是...

排序演算法2 氣泡排序,快速排序

氣泡排序 include using namespace std void bubblesort int arry,int size void print int arry,int size void main print arry,5 bubblesort arry,5 print arry,5 ...

快速排序演算法2

package com.mianshi describe 快速排序演算法2 排序結果從小到大 create on 2011 05 25 author sylor.liu version 1.0 since jdk1.6 public class quicksort2 對資料進行快速排序 privat...