快速排序原理及Java实现
https://blog.csdn.net/jianyuerensheng/article/details/51258374
1、基本思想:
快速排序是我們之前學習的冒泡排序的升級,他們都屬于交換類排序,都是采用不斷的比較和移動來實現排序的。快速排序是一種非常高效的排序算法,它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到后面,關鍵字較小的記錄從后面直接移動到前面,從而減少了總的比較次數和移動次數。同時采用“分而治之”的思想,把大的拆分為小的,小的拆分為更小的,其原理如下:對于給定的一組記錄,選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分,直到序列中的所有記錄均有序為止。
2、復雜度分析:
(1)最壞時間復雜度?
最壞情況是指每次區間劃分的結果都是基準關鍵字的左邊(或右邊)序列為空,而另一邊區間中的記錄僅比排序前少了一項,即選擇的關鍵字是待排序記錄的最小值或最大值。最壞情況下快速排序的時間復雜度為。?
(2)最好時間復雜度?
最好情況是指每次區間劃分的結果都是基準關鍵字的左右兩邊長度相等或者相差為1,即選擇的基準關鍵字為待排序的記錄的中間值。此時進行比較次數總共為?nlogn,所以最好情況下快速排序的時間復雜度為。?
(3)平均時間復雜度?
快速排序的平均時間復雜度為。在所有平均時間復雜度為O(nlogn)的算法中,快速排序的平均性能是最好的。?
(4)空間復雜度?
快速排序的過程中需要一個棧空間來實現遞歸。最好情況,遞歸樹的深度為,其空間復雜度也就是O(nlogn);最壞情況下,需要進行?n-1次遞歸,其空間復雜度為O(n);平均情況,空間復雜度為O(nlogn).?
(5)基準關鍵字的選取,基準關鍵字的選取是決定快速排序算法的關鍵,常用的基準關鍵字的選取方式如下:?
第一種:三者取中。將序列首、尾和中間位置上的記錄進行比較,選擇三者中值作為基準關鍵字。?
第二種:取left和right之間的一個隨機數,用n[m]作為基準關鍵字。采用這種方法得到的快速排序一般稱為隨機的快速排序。
3、排序過程如下:
以數組{49,38,65,97,76,13,27,49}為例,選擇第一個元素49為基準?
初始化關鍵字: [49,38,65,97,76,13,27,49]?
我是這樣來描述它的思想的,給定一個數組,從前往后用i標識,從后往前用j標識,找一個基準元素,這里我們把第一個做基準元素。
1.先從后往前查找,循環每次進行j--,直到找到一個比基準元素小的元素然后放到基準元素位置,基準元素放到該元素位置
2.然后從前往后查找,循環每次進行i--,直到找到一個比基準元素大的元素,然后把該元素放到基準元素位置,基準元素放到該元素的位置
我們基準元素始終放在index里面,所以在不斷的比較互換位置中始終不會覆蓋基準元素,可以想象在這個過程中交換后的基準元素位置始終為空,沒有放任何元素。
4、Java實現如下:
public class QuickSort {public static void sort(int a[], int low, int hight) {int i, j, index;if (low > hight) {return;}i = low;j = hight;index = a[i]; // 用子表的第一個記錄做基準while (i < j) { // 從表的兩端交替向中間掃描while (i < j && a[j] >= index)j--;if (i < j)a[i++] = a[j];// 用比基準小的記錄替換低位記錄while (i < j && a[i] < index)i++;if (i < j) // 用比基準大的記錄替換高位記錄a[j--] = a[i];}a[i] = index;// 將基準數值替換回 a[i]sort(a, low, i - 1); // 對低子表進行遞歸排序sort(a, i + 1, hight); // 對高子表進行遞歸排序}public static void quickSort(int a[]) {sort(a, 0, a.length - 1);}public static void main(String[] args) {int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };quickSort(a);System.out.println(Arrays.toString(a));} }總結
以上是生活随笔為你收集整理的快速排序原理及Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【项目管理】提升项目团队绩效的关键
- 下一篇: java测试案例_微服务实战测试之Jav