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

2021-10-01 20:55:32 字數 1757 閱讀 3459

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 ο(nlogn) 次比較。在最壞狀況下則需要 ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 ο(nlogn) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

快速排序又是一種分而治之思想在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。

快速排序的名字起的是簡單粗暴,因為一聽到這個名字你就知道它存在的意義,就是快,而且效率高!它是處理大資料最快的排序演算法之一了。雖然 worst case 的時間複雜度達到了 o(n²),但是人家就是優秀,在大多數情況下都比平均時間複雜度為 o(n logn) 的排序演算法表現要更好,可是這是為什麼,在《演算法藝術與資訊學競賽》上找到了滿意的答案:

快速排序的最壞運**況是 o(n²),比如說順序數列的快排。但它的平攤期望時間是 o(nlogn),且 o(nlogn) 記號中隱含的常數因子很小,比複雜度穩定等於 o(nlogn) 的歸併排序要小很多。所以,對絕大多數順序性較弱的隨機數列而言,快速排序總是優於歸併排序。

從數列中挑出乙個元素,稱為 「基準」(pivot);

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;

遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序;

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

* @description: kuaisu排序

* @author: wangjie

* @date: 2020/1/2 9:37

* @phone: 123

*/public

class

test5

;int

arr1 =

quicksort

(arr,

0,arr.length -1)

;for

(integer i : arr1)

}public

static

int[

]quicksort

(int

arr,

int left,

int right)

return arr;

}public

static

intpartition

(int

arr,

int left,

int right)

}swap

(arr, pivot, index -1)

;return index -1;

}private

static

void

swap

(int

arr,

int i,

int j)

}

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

很受打擊啊啊啊啊啊!這道排序題我很久之前就做過,而且當時沒用20分鐘就搞定了,可是,今天在公司做完手上的活之後打算刷題時,又心血來潮的想重做一遍,心想反正也花不了多少時間,結果。血崩了。要求 對於乙個int陣列,請編寫乙個快速排序演算法,對陣列元素排序。給定乙個int陣列a及陣列的大小n,請返回排序...

排序演算法之快速排序

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

排序演算法之快速排序

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