快速排序詳解

2021-10-04 10:13:21 字數 1678 閱讀 8010

1、快速排序的簡單介紹

演算法思想:基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點(一般為陣列的第乙個),然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌(low指向起始位置,high指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換low和high位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換low和high位置的值,如此往復迴圈,直到low>=high,然後把基準點的值放到high這個位置。一次排序就完成了。以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。

2、快速排序演算法的特點

快速排序的時間主要耗費在劃分操作上,對長度為k的區間進行劃分,共需k-1次關鍵字的比較;

最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。時間複雜度為o(nn);

在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:o(nlogn);

儘管快速排序的最壞時間為o(nn),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlogn)。

3、快速排序演算法的**實現

public

static

void

main

(string [

]args)

; int start =0;

//左指標為0

int end = a.length-1;

//右指標為尾

sort

(a,start,end)

;for

(int i =

0; i//指定陣列,左右指標

public

static

void

sort

(int[

] a, int low, int high)

//從前往後比較

//右大於左且陣列中左的值小於等於key時執行---也就是左大於key的位置

while

(end>start&&a[start]

<=key)

//如果沒有比關鍵值大的,比較下乙個,直到有比關鍵值大的交換位置

start++

;//左大於key

if(a[start]

>=key)

//此時第一次迴圈比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞迴呼叫

}//end=start=3 low=0,high=9

//遞迴

if(start>low)

sort

(a,low,start-1)

;//左邊序列。第乙個索引位置到關鍵值索引-1

if(endsort

(a,end+

1,high)

;//右邊序列。從關鍵值索引+1到最後乙個

}

快排是目前挺受歡迎的一種排序,很多面試官也很喜歡讓應聘者手撕快排或者解釋。

快速排序詳解

快速排序也是基於交換的原理進行的,是對氣泡排序的一種改進。即它是通過不斷比較和移動交換來實現排序的,只不過它的實現,增大了記錄的比較和移動的距離,將關鍵字比較大的記錄從前面直接移動到後面,關鍵字較小的記錄從後面直接移動到前面,從而減小了總的比較次數和移動次數。快速排序是找出乙個元素 理論上可以隨便找...

快速排序詳解

對於陣列s 2,1,3,0,4,5,8,7,1 進行排序 最好的情況是val每一次取到中間值,則複雜度為nlog n 最壞的情況是val每一次取到最小值或者最大值,則複雜度為n 2 include include include include include include include inc...

快速排序詳解

快速排序法詳解 快速排序法 quicksort 是一種非常快的對比排序方法。它也divide and conquer思想的實現之一。自從其產生以來,快速排序理論得到了極大的改進,然而在實際中卻十分難以程式設計出正確健壯的 本文將對快速排序演算法的基本理論和程式設計實踐方面做作乙個全面的講解。在本文講...