在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。
時間複雜度:每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition過程,每次partition過程時間複雜度o(n),因此最好時間複雜度o(nlogn),平均時間複雜度o(nlogn),但是時間複雜度和選取的基準值有關,如果選取的基準值不好,則每次劃分的區間很不均勻,會影響時間複雜度,極限情況每次選取的基準值為最大值或者最小值,則一共需要n次partition過程,時間複雜度退化為o(n^2),為了解決這個問題,引入隨機快排,即選取基準值時選擇陣列乙個隨機值,時間複雜度的計算變成概率問題,長期期望下時間複雜度為o(nlogn)
空間複雜度:o(1)
package cn.lzx.sort;
/** *@classnamequicksort
*@description 快排
*@author lzx
*@date2019/10/28 13:16
*@version v1.0
**/public class quicksort
quicksort(arr,0,arr.length-1);
}private static void quicksort(int arr,int left,int right)
}/**
* 將陣列的某一區域劃分為小於num和大於num的兩部分區域 返回等於區域的左右下標
* @param arr 陣列
* @param left 陣列左邊界
* @param right 陣列右邊界
* @param num 比較數值
* @return 等於區域的左右下標
*/private static int partition(int arr,int left,int right,int num)else if (arr[cur] > num)else
}return new int;
}private static void swap(int arr, int i, int j)
private static void print(int arr)
system.out.println(res.tostring());
}public static void main(string args) ;
quicksort(arr);
print(arr);
}}
排序演算法(五) 快速排序
快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。快速排序原理 兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部...
排序演算法五 快速排序
取陣列最中間的那個數為基數 取哪乙個數為基數都可以,取中間的只是為了好理解 在左邊找乙個比基數大的數,在右邊找乙個比基數小的數,如果找到就交換兩個數的位置,交換過後再向下尋找,直到左邊的角標大於等於右邊則退出,一輪排序後,基數的左邊一定都是比基數小的,基數的右邊一定是比基數大的,注意 基數不一定還在...
排序演算法總結(五)快速排序
快速排序的思想是選取待排陣列中的乙個數作為中間數 一般是第乙個數 然後將陣列中數與這個中間數進行比較,使中間數左邊的數都小於中間數,中間數右邊的數都大於中間數,這樣中間數就在正確的位置上,然後將左右兩部分再次進行相同的操作,最終會得到乙個有序的陣列。快速排序的演算法平均時間複雜度為o nlogn 最...