快速排序採用了分而治之的思想,是乙個給基準資料找其正確索引位置的過程.
其本質就是把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了該資料在陣列中的正確位置
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.分到一定細度的時候,每乙個部分就只有乙個元素了,對他們進行...
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...