八大排序 快速排序(java實現)

2021-08-28 22:21:28 字數 2877 閱讀 7479

快速排序是一種比較「中庸」的排序方法,它在最好和最壞的情況下的時間複雜度都比較可觀。因此,當我們遇到一串資料,不知道用那種排序方法比較合適的時候,可以先用快速排序解決一下問題。甚至,在學會快速排序的演算法和**之後,我們可以把**背下來,以備不時之需。

下面我們正式開始學習這種排序方法。

在一串有序的數列中,我們總能找到乙個處於中間或類似中間位置的數,在這個數一邊的數比它大,另一邊的數比它小。那麼,在對無序陣列排序的時候,我們能否找到這樣的乙個數,調整另外的數,讓比它小的數居於一邊,比它大的數居於一邊,這樣不就能達到排序的目的了嗎?這就是快速排序的思想。

口說無憑,我們來舉個例子看一看:

有一組數:

5,3,7,6,8,1,4,2

我們來對它進行快速排序

首先,我們選擇乙個中間數5,然後我們來進行交換操作,建立兩個標記,如下:

每次將右邊的標記向左邊移動,將左邊的標記向右邊移動,如果在右邊找到了比中間數5小的數,在左邊找到了比中間數5大的數,則將這兩個數交換。因為我們選擇了最左邊的數當中間數(一般選擇最左邊或者最右邊的數當中間數),所以我們每次的標記移動要從最右邊先開始移動(原因後面會說),當找到比5小的2時,標記停止移動,然後左邊的標記向右移動,當找到比5大的7時,停止移動,如圖:

交換這兩個數:

右邊標記再次向左移動,找到比5小的數4;

左邊標記向右移動,找到比5大的數6,如圖:

交換:

右邊標記再次向左移動,找到比5小的數1;

左邊標記向右移動,找到比5大的數8,如圖:

交換:

右邊標記再次向左移動,我們發現右邊的標記和左邊的標記相遇了:

於是我們停止移動,將標記相遇位置的數和之前我們選定的中間數5交換:

好了,現在在5左邊的數都比5小,在5右邊的數都比5大了

這裡我們就要解決先前的問題了,為什麼選定最左邊的數作為中間數要每次讓右邊的標記先移動?因為,如果我們每次讓左邊的標記先移動的話,會發現,最後標記相遇的位置是8:

當我們把5和8做了交換之後,發現恰恰是我們交換過去的8在5的左邊比5大,這樣就沒法達成5左邊的數都比5小的目的,所以我們要讓右邊的標記先移動。

如果我們選擇最右邊的數當中間數而讓左邊的標記先移動也是同樣的道理。

現在我們已經以5為中間點將資料分到了兩邊,一邊比5小,一邊比5大,但是5左邊和右邊的數還不是有序的,因此,我們要分別在5的左邊和右邊進行剛才的選取中間數然後交換的操作,為了省事,不再解釋,用圖說話:

至此,我們就通過快速排序完成了對這一串數的排序操作,雖然講的很羅嗦,但是想必你已經明白了演算法原理,下面我們來看看**實現:

public

void

quicksort

(int a[

],int start,int end)

//start是每次快速排序的陣列開始下標,end是結束下標

int startnum=a[start]

; int left=start;

//left是左標記的下標

int right=end;

//right是右標記的下標

while

(left!=right)

//當左右標記沒有相遇的時候

while

(left

<=a[start]

) int temp=a[left]

;//交換左邊右邊數的操作

a[left]

=a[right]

; a[right]

=temp;

} a[start]

=a[left]

;//將中間數交換到左右標記相遇的地方

a[left]

=startnum;

quicksort

(a,left+

1,end)

;//對中間數左邊的陣列進行遞迴快速排序

quicksort

(a,start,right-1)

;//對中間數右邊的陣列進行遞迴快速排序

}public

static

void

main

(string[

] args)

;quicksort

(a,0

,a.length-1)

;for

(int p:a)

}

八大排序(三) 快速排序

快速排序的基本思想如下 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算...

八大排序(五)快速排序

快速排序使用了分治策略。一 選定乙個基準數 一般選取第乙個數 然後把大於它的數都放在它右邊,把小於它的數放左邊。二 這樣就把陣列分成左右兩部分。再將左右兩部分分別遞迴執行第一步,最終當執行第一步的部分大小為一時,遞迴完成,原陣列排序完成。public class quicksort 將剛剛找到的數插...

八大排序之快速排序

快速排序 public class quicksort int arr 測試時間複雜度 o n 2 int arr new int 80000 for int i 0 i arr.length i long start time system.currenttimemillis quicksort ...