大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面試題首頁 > 快速排序面試題

快速排序面試題

001什么是快速排序?

1)快排問題和荷蘭國旗問題類似,快速排序采用的思想是分治思想。主要分兩個步驟:

第一步:從要排序的數組中隨便找出一個元素作為基準(pivot),然后對數組進行分區操作,使基準左邊元素的值都不大于基準值,基準右邊的元素值都不小于基準值。

第二步就是對高段位和地段為兩部分進行遞歸排序。

2)算法圖解

【1】從【5,3,5,6,2,7】數組中,隨機選取一個數(假設這里選的數是5)與最右邊的7進行交換 ,如下圖

【2】準備好以5為分界點,三個區域分別為小于區、大于區(大于區包含最右側的一個數)和等于區,并準備一個指針,指向最左側的數,如下圖

【3】接下來,每次操作都拿指針位置的數與5進行比較,交換原則如下:

-----------------------------------------------------------

原則1:指針位置的數<5

拿指針位置的數與小于區右邊第一個數進行交換

小于區向右擴大一位

指針向右移動一位

原則2:指針位置的數=5

指針向右移動一位

原則3:指針位置的數>5

拿指針位置的數與大于區左邊第一個數進行交換

大于區向左擴大一位

指針位置不動

-------------------------------------------------------

根據圖可以看出指針指向的第一個數是5,5=5,滿足交換原則2,指針向右移動一位,如下圖

【4】從上圖可知,此時3<5,根據交換原則第1點,拿3和5(小于區右邊第一個數)交換,小于區向右擴大一位,指針向右移動一位,結果如下圖

【5】從上圖可以看出,此時7>5,滿足交換原則第3點,7和2(大于區左邊第一個數)交換,大于區向左擴大一位,指針不動,如下圖

【6】從上圖可以看出,2<5,滿足交換原則第1點,2和5(小于區右邊第一個數)交換,小于區向右擴大一位,指針向右移動一位,得到如下結果

【7】從上圖可以看出,6>5,滿足交換原則第3點,6和6自己換,大于區向左擴大一位,指針位置不動,得到下面結果

【8】此時,指針與大于區相遇,則將指針位置的數6與隨機選出來的5進行交換,就可以得到三個區域:小于區,等于區,大于區,周而復始完成最終的排序

002快速排序的代碼實現?

public static void quickSort(int[] arr) {
    if (arr == null || arr.length < 2) {
	    return;
	}
	quickSort(arr, 0, arr.length - 1);
}
// arr[l..r]排好序
public static void quickSort(int[] arr, int L, int R) {
    if (L < R) {
        swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
		int[] p = partition(arr, L, R);
		quickSort(arr, L, p[0] - 1); // < 區
		quickSort(arr, p[1] + 1, R); // > 區
	}
}
// 這是一個處理arr[l..r]的函數
// 默認以arr[r]做劃分,arr[r] -> p     <p   ==p   >p
// 返回等于區域(左邊界,右邊界), 所以返回一個長度為2的數組res, res[0] res[1]
public static int[] partition(int[] arr, int L, int R) {
    int less = L - 1; // <區右邊界
    int more = R; // >區左邊界
    int index=L;
    while (index < more) { // L表示當前數的位置   arr[R]  ->  劃分值
        if (arr[index] < arr[R]) { // 當前數   <  劃分值
            swap(arr, ++less, index++);
        } else if (arr[index] > arr[R]) { // 當前數   >  劃分值
            swap(arr, --more, index);
        } else {
            index++;
        }
    }
    swap(arr, more, R);
    return new int[] { less + 1, more };
}

003快速排序時間復雜度?

快速排序的時間復雜度在最壞情況下是O(N2),平均的時間復雜度是O(N*lgN)。
假設被排序的數列中有N個數。遍歷一次的時間復雜度是O(N),需要遍歷多少次呢? 至少lg(N+1)次,最多N次。 為什么最少是lg(N+1)次? 快速排序是采用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數最少是lg(N+1)次。 為什么最多是N次? 這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數最多是N次。

004快速排序穩定性?

快速排序是不穩定的算法,它不滿足穩定算法的定義。

目錄

返回頂部
主站蜘蛛池模板: 国产精品看片 | 全部毛片免费看 | 欧美操片 | 九九在线精品视频播放 | 新久草在线视频 | 久久黄色免费视频 | 人人爽天天爽夜夜爽qc | 青草青草久热精品视频在线观看 | 久久乱69小说 | 天天艹 | 香蕉视频18 | 西西大胆实体啪啪色哟哟 | 成人亚洲欧美 | 欧美日韩一区二区三区毛片 | 99干99| 免费看欧美一级特黄α大片 | 欧美日韩在线观看区一二 | 日本特级| 澳门一级特黄录像免费播黄 | 国产精品久久久久久免费 | 欧美日韩一级片在线观看 | 大陆一级毛片免费视频观看 | 欧美日韩中文字幕在线手机版本 | 亚洲四虎 | 国产在线一区二区 | 国产成a人片在线观看视频99 | 激情在线观看视频 | 欧美黄网站 | 国产成人刺激视频在线观看 | 四虎亚洲国产成人久久精品 | 淫视频在线观看 | 欧美午夜影院 | 亚洲欧美韩日 | 国产精品99在线观看 | 天天操天天舔天天干 | 久久网页| 亚洲欧美日韩在线精品2021 | 婷婷尹人香蕉久久天堂 | 久久国产成人亚洲精品影院老金 | 精品久久久久久久免费加勒比 | 综合色久七七综合七七蜜芽 |