經典快排思路:
1.首先設定乙個分界值,通過該分界值將陣列分為左右兩個部分。
2.左邊部分是小於等於分界值的資料,右邊部分是大於分界值的資料。
3.左邊和右邊遞迴呼叫方法:設定分界值,劃分左邊的是小於等於分界值的資料,右邊是大於分界值的資料。
舉例:4,6,2,0,3
1.選取最右邊的3作為分界值,劃分後陣列的左邊部分是【2,0】,陣列的右邊部分是【4,6】,3是在中間位置。
2.左邊部分遞迴呼叫選取分界值,劃分左右部分的操作:選取0作為臨界值,沒有左邊部分,中間是0,右邊部分是2,這樣子左邊就完成了排序【0,2】。
3.右邊部分遞迴呼叫選取分界值,劃分左右部分的操作,選取最右邊的6作為分界值,左邊部分是4,中間是6,沒有中間部分,這樣子右邊就完成了排序【4,6】。
4.整體的排序就是【0,2,3,4,6】。
tips:我們選取的是最右邊的數作為分界值。
**實現:
public static void quicksort(int arr)
quicksort(arr,0,arr.length-1);
}//遞迴呼叫快排
public static void quicksort(int arr,int l,int r)
else
} return new int;
}//兩個數字交換
public static void swap(int arr, int i, int j)
時間複雜度的分析:
1.如果分界值恰好落在陣列中間,就是左右部分恰好是相等的,利用遞迴的master公式,最好情況下的時間複雜度是o(nlogn);
2.如果已經排好序的陣列,最壞情況下的時間複雜度是o(n*2);
3.所以我們可以用隨機快排法,隨機選中陣列中的乙個數,和最右邊的數字交換,再進行快排,這個是乙個概率事件表示式,所以平均時間複雜度是o(nlogn),額外的空間複雜度是o(logn);
例題:荷蘭國旗問題(快速排序)
給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的
右邊。要求額外空間複雜度o(1),時間複雜度o(n)
public static int sepatare(int arr, int l, int r)
else
} return new int;
}
排序演算法 1)快速排序
一 簡介 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 時間複雜度為o n logn 不穩定。基本思想是 1 先從數列中取乙個數作為基準數 2 進行分割槽,把把大於基準數的所有數放在它的...
排序演算法1 快速排序
今兒閒著,實現了下一維陣列快速排序演算法。快速排序分三個步驟 參考維基百科 1.選取乙個基準值。一般以第乙個為基準 2.重新排序,所有比基準小的都放在左邊,所有比基準大的都放在右邊。排序過後,該基準處於數列中間位置。分治法中的分,以基準值為中心,分為左右兩個分割槽 3.遞迴的按照1 2兩步驟排序左右...
快速排序演算法1
package com.mianshi describe 快速排序演算法1 排序結果從小到大 create on 2011 05 25 author sylor.liu version 1.0 since jdk1.6 public class quicksort1 以a r 為基準值,將該段資料拆...