排序演算法(五) 快速排序

2021-09-29 02:39:34 字數 1301 閱讀 3047

在陣列中選取乙個數作為基準值,進行乙個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 最...