《演算法闖關記》快速排序

2021-09-26 04:22:24 字數 2023 閱讀 3015

快速排序採用了分而治之的思想,是乙個給基準資料找其正確索引位置的過程.

其本質就是把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了該資料在陣列中的正確位置

1.首先選取乙個基準資料,arr[0],假設是陣列的起點資料作為基準數 temp,設兩個指示標誌:low指向起始位置,high指向末尾.

2.從後半部分開始,如果掃瞄到的值大於基準資料就讓high減1,如果發現有元素比該基準資料的值小(如上圖中18<=tmp),就將high位置的值賦值給low位置 ,

3.然後開始從前往後掃瞄,如果掃瞄到的值小於基準資料就讓low加1,如果發現有元素大於基準資料的值(如上圖46=>tmp),就再將low位置的值賦值給high位置的值

4.再開始從後向前掃瞄

5.然後再開始從前往後遍歷,直到low=high結束迴圈,此時low或high的下標就是基準資料

①先從隊尾開始向前掃瞄且當low < high時,如果a[high] > tmp,則high–,但如果a[high] <

tmp,則將high的值賦值給low,即arr[low] = a[high],同時要轉換陣列掃瞄的方式,即需要從隊首開始向隊尾進行掃瞄了

②同理,當從隊首開始向隊尾進行掃瞄時,如果a[low] < tmp,則low++,但如果a[low] >

tmp了,則就需要將low位置的值賦值給high位置,即arr[low] =

arr[high],同時將陣列掃瞄方式換為由隊尾向隊首進行掃瞄.

③不斷重複①和②,知道low>=high時(其實是low=high),low或high的位置就是該基準資料在陣列中的正確索引位置

public class quicksort ;

quicksort(arr, 0, arr.length - 1);

system.out.println("排序後:");

for (int i : arr)

}private static void quicksort(int arr, int low, int high)

}private static int getindex(int arr, int low, int high)

// 如果隊尾元素小於tmp了,需要將其賦值給low

arr[low] = arr[high];

// 當隊首元素小於等於tmp時,向前挪動low指標

while (low < high && arr[low] <= tmp)

// 當隊首元素大於tmp時,需要將其賦值給high

arr[high] = arr[low];

}// 跳出迴圈時low和high相等,此時的low或high就是tmp的正確索引位置

// 由原理部分可以很清楚的知道low位置的值並不是tmp,所以需要將tmp賦值給arr[low]

arr[low] = tmp;

return low; // 返回tmp的正確位置}}

時間複雜度:最優o( nlogn ) 最差o( n^2 )

最優的情況下空間複雜度為:o(logn) ;每一次都平分陣列的情況

最差的情況下空間複雜度為:o( n ) ;退化為氣泡排序的情況

快排**

快排三種場景

《演算法闖關記》 歸併排序

核心思想是將兩個有序的數列合併成乙個大的有序的序列。通過遞迴,層層合併,即為歸併 1.當我們要排序這樣乙個陣列的時候,歸併排序法首先將這個陣列分成一半 2.然後繼續把左邊的陣列或者序列,進行劃分,同理右邊的陣列或者序列進行劃分,遞迴劃分 3.分到一定細度的時候,每乙個部分就只有乙個元素了,對他們進行...

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

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

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

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...