常用演算法之快速排序

2022-07-05 01:57:12 字數 1638 閱讀 7609

演算法對開發的重要性不言而喻,所以準備記錄一些常用演算法。

本篇文章先介紹一下快速排序演算法。這是在實際中最常用的一種排序演算法,速度快,效率高。快速排序是非常優秀的排序演算法。它是由是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,屬於分治法(divide-and-conquermethod)的一種。

演算法思想:

1.先從數列中取出乙個數作為基準數(理論上可以隨便找乙個)。

2.將比基準數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

舉例說明:

40,20,10,70,50,60

排序過程(選取第乙個元素作為基準(pivot))

pivot[40] 40,20,10,70,50,60   首先用40當作基準(pivot),使用low(紅色表示,從左往右掃瞄) ,high(藍色表示,從右向左掃瞄)兩個指標分別從兩邊進行掃瞄,把比40小的元素和比40大的元素分開。首先比較40和60,60比40大,j左移

pivot[40] 40,20,10,70,50,60 比較40和50,60比40大,high左移

pivot[40] 40,20,10,70,50,60 比較40和70,70比40大,high左移

pivot[40] 40,20,10,70,50,60 比較40和10,10比40小,將10移動到40的位置(high停止移動)

pivot[40] 10,20,10,70,50,60 比較40和20,20比40小,low右移 (右移後low==high,將基準40放到此位置)

pivot[40] 10,20,40,70,50,60 第一次排序過程結束,此時已經把比40小的元素和比40大的元素分開(分治)。

對[10,20],[70,50,60]分別重複以上過程,知道完成排序。很明顯這是乙個遞迴過程。如下圖是使用演算法演示軟體的演示效果(感謝軟體的作者):

**如下:

public

static

void qsort(int arr, int low, int

high)

public

static

int partition(int arr, int low, int

high)

arr[first] = key; //

基準元居中

return

first;

}

總結:快速排序演算法利用分治法,將比基準小的都放到左邊,將比基準大的放到右邊(當然如果是降序排,則與之相反)。在排序過程中先從後往前掃瞄,在從後向前掃瞄。直到完成排序。另外快速排序有較多的改進版本(主要是對基準數的選取),如隨機選取基準,中間數作為基準快排。這些都不討論了,有興趣的可以去了解了解。另外還有時間複雜度,因為快速排序不是穩定的排序,其最壞情況的時間複雜度θ(n^2),平均的時間複雜度o(nlogn)。其公式的數學推導,可以參考演算法導論。

常用排序演算法之快速排序

快速排序 快速排序也是一種分治的遞迴演算法。取陣列s中任一元素v,作為樞紐元。用樞紐元將s中的元素分成倆部分,對這兩部分分別再次進行快速排序。當s中元素個數是0或1時,則返回。因為快速排序要根據樞紐元將元素分成倆部分,因此,樞紐元的選取對程式的時間複雜度是有影響的。一般的樞紐元選取策略是取左端 右端...

常用排序演算法之快速排序

快速排序最壞情況執行時間為o n2 但實際中通常都是用於排序的最佳的實用選擇,因為其平均效能相當好 期望的執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。快速排序是一種就地排序。同時,是一種不穩定的排序。本文內容主要參照演算法導論。快速排序主要利用了分治的思想。一般分為三步進行 分...

java常用演算法之快速排序

快速排序的思想 用分治的策略,將陣列分的越來越小,再每組中來比較陣列元素之間的大小 快速排序的實現方式 1.分別設定兩個指標來指向陣列的首元素和尾元素 2.一般將陣列的首元素來作為乙個樞紐元素 也就是其他的元素需要跟這個元素來比較大小,比這個元素大的需要放在它的右邊,比它小的需要放在這個元素的左邊 ...