快速排序(java)

2021-07-04 05:12:01 字數 1316 閱讀 1380

各種排序演算法裡快速排序的平均時間複雜度最好,最近專門去理解了一下快速排序,現在記錄如下:

public static void quicksort(int array, int low, int height) 

array[i] = array[j];

while (i < j && temp > array[i])

array[j] = array[i];

} array[i] = temp;

if (low < i)

if (i < height)

}

while(i < j)這樣乙個迴圈結束我們稱之為一次快速排序,一次快速排序開始會首先選擇乙個陣列元素作為關鍵字,上面的程式選擇關鍵字使用的是當前陣列的第0個元素,while迴圈開始,首先從陣列的最右邊開始比較,如果最右邊元素大於關鍵字則不做交換,只是把j++,直到找到右邊元素有小於關鍵字的為止。如果小於關鍵字則把當前元素賦值給左邊的空位。然後進入左邊,左邊類同,直到while(i

接下來針對具體的陣列說一下快速排序的過程,上圖的陣列是特殊設計的,每次選擇的關鍵字都是恰巧放在中間位置。選中陣列第乙個元素為比較關鍵元素,首先拿關鍵元素6 去陣列的末尾比較,所有大於關鍵字的元素都往陣列後半部分放,所有小與關鍵字的元素往陣列前半部分放。6與10,6與11,6與7,6與8,6與9比較,陣列都不發生變化,知道比較到3,所以將3放到6的位置,然後6與2,6與1,6與5,6與4,全部小於關鍵字,陣列不發生改變,最後i > j 迴圈結束,6找到自己的位置,放在原來3的位置,也就是陣列的中間。然後6的左邊陣列和6的右邊陣列分別進行上一次的排序,如圖。接下來我們就分析一下在最好狀態下的時間複雜度是怎麼得來的。

假設陣列元素個數為n,第一次快速排序,選擇陣列乙個元素作為比較的關鍵字,第一次快速排序結束,關鍵字找到自己的位置正好在陣列的中間,然後第二次快速排序,把第一次排序結束之後的陣列關鍵字位置左邊部分和右邊部分分別進行快速排序,以此類推,每乙個子陣列的書目都是上一次陣列的1/2。根據上圖,每一行不管被2除以多少次總的比較次數都是n。那麼問題就變成了,n被除以多少次剛好大於1,就變成求2的多少次方剛好小於或者等於n,也就是log以2為底n的對數次即lgn,而n最多被除以這麼多次,而每次比較n次所以,總的比較次數就是:nlgn。快速排序是一種不穩定的排序,在最壞的情況下,也就是乙個已經不亂序的情況下,比如是從小到大排序的我們需要把它變成從大到小,那麼這樣一種情況快速排序的時間複雜度為o(n的平方),當然這樣一種情況幾乎是不會放生的,因為不論從大到小還是從小到大都是一種有序,應該會很少碰到需要顛倒順序的需求吧!

java 快速排序

public class myquicksort while strvoid middle strvoid low lowif low hight else if hight middle temp strvoid hight strvoid hight strvoid low strvoid lo...

快速排序(java)

快速排序 public class quacksort int pivot arr low 取第乙個數作為中間數 左滑塊當前的下標數,從第二個數字開始,從最後乙個開始 int left low 1 int right high 右滑塊當前的下標數 while left right 從右邊開始找 wh...

快速排序(Java)

快速排序的思想是基於分治法加上遞迴思想,排序陣列時,將陣列分成兩個小部分,然後對它們遞迴排序,直到它們都不可再分為止。快速排序的平均執行時間是o nlog n 遠比插入排序的o n 2 時間小。快速排序 param arr param start param end return private s...