排序演算法之快速排序

2021-07-22 16:41:51 字數 1447 閱讀 2895

同樣的先上這張圖 

下面分析交換排序之快速排序:

快速排序的思想是先選擇乙個基準元素(一般取第乙個元素),然後對剩下的元素作兩端遍歷,左邊找到比基準元素大的元素,右邊找到比基準元素小的元素,兩者交換,重複下去直到low>high,再把基準元素跟high交換。這樣一遍下來,基準元素左邊的元素都比基準元素小,基準元素右邊的元素都比基準元素大。

然後對基準元素左邊和右邊分別作快速排序。

快速排序是通常被認為在同數量級(o(nlog2n))的排序方法中平均效能最好的。但若初始序列按關鍵碼有序或基本有序時,快排序反而蛻化為氣泡排序。一般公認的比較好的排序演算法是先用快速排序使序列基本有序,當快速排序遞迴到一定深度後轉為堆排序或插入排序,比如內省排序就是先快速後堆。

快速排序最好及平均情況時間複雜度為o(nlogn),最壞情況為o(n2)。

快速排序並不需要額外的空間,空間複雜度為o(1)。

快速排序是不穩定的。

as**:

/**

* 快速排序實現函式

* 先乙個基準,把小於基準的元素放到左邊,大於基準的元素放到右邊

* 返回基準

*/private function partition(arr:array,first:int,last:int):int

//找到第乙個比基準元素大的元素

while(low<=high && arr[low]<=privot)

if(lowarr[high])else

} /**

* 快速排序

*/private function quicksort(arr:array,low:int,high:int):void

}templateint sorthelp::partition(t l, int length, int low, int high)

while (low < high && l[low] <= l[pivot])

if (low < high)

}if (l[high] < l[pivot])

return pivot;

#else

int pivot = l[low];

while (low < high)

if (l[high] < pivot)

//從前面找小的數往後填補

while (low < high && l[low] <= pivot)

if (l[low] > pivot)

}//填補最後乙個元素並返回

l[high] = pivot;

return high;

#endif // 0

}

總結,快速排序的時間複雜度為o(nlogn),最壞情況下為o(n2),空間複雜度為o(1),不穩定。

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...

排序演算法之快速排序

快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...

排序演算法之快速排序

快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...