1. 程式人生 > 其它 >JQ H5 input checkbox實現單選

JQ H5 input checkbox實現單選

技術標籤:演算法演算法java快速排序

如果用一句話來描述快速排序的中心思想,那就是:“先選取一個基準,把比基準小的數放在一堆,把比基準大的數放另一堆,再分別對兩堆繼續進行分堆,直到最後每堆只剩下一個數,那麼分堆停止,排序完成。”

演算法步驟

  1. 先從數列中取出一個數作為基準數key;
  2. 從右至左遍歷數列,把比 key 小的數放到 key 的左邊;再從左至右遍歷數列,把比 key 大的數放到 key 的右邊;
  3. 以 key 為分界點將數列分成左右兩區間,再分別對左右區間重複第 1,2 步,遞迴開始
  4. 當區間只剩下 1 個數時,遞迴停止。

一般,我們會將數列的第一個數選作 key。

例項

假設有一個無序數列 nums = {72, 6, 57, 88, 60, 42, 83, 73, 48, 85} 需要排序,那麼使用快速排序的過程如下:

設定:key = 72,first 指向頭部即 72,last 指向尾部即 85;

初始狀態

last 不停 -1,直到 nums[last]比 key 小,由此可知,當 last 指向48時,滿足條件。那麼我們便將 48 調整到 first 的位置,即將 72 替換掉。此時 nums[first] = nums [last] = 48。

注意:因為我們事先將 72 存放到了 key 裡,所以 nums[first] 可以直接被 48 覆蓋掉。

第一次找到比 key 小的數
然後我們讓 first 不停 +1,直到遇到比 key 大的數,也就是 88,然後將 88 填充到 last 的位置,將 48 覆蓋掉。因為 48 已經存到了之前 first 的位置,所以此處可以放心地將 88 移過來。

第一次找到比 key 大的數
因為此時 first 和 last 尚未重合,這意味著他們之間還有許多數並沒有和 key 進行比較。因此,我們需要重複上面兩個步驟,直到 first 和 last 重合,注意 last 的 -1 操作和 first 的 +1 操作必須交替進行。下面是這個過程的每一個階段:

在這裡插入圖片描述
在這裡插入圖片描述
此時,last 和 first 重合了,我們再將 key 的值,也就是 72,存放到 first 和 last 重合指向的這個地方,也就是 42 的位置:
在這裡插入圖片描述
此時,第一次迴圈徹底完成,經過這次迴圈,我們可以發現數列被 72 切割成了兩塊,72 的左邊都是比 72 小的數,72 右邊都是比 72 大的數,接下來我們需要做的事就是對左右兩個區間再分別重複上面的步驟,直到最後分無可分。

程式碼示例(Java)

public static void quick_sort(int[] nums, int l, int r) {
    // 設定退出遞迴條件,若區間只有1個數,則退出遞迴
    if (l + 1 > r) return;
    // 定好首末指標,並將基準值取出到key中
    int first = l;
    int last = r;
    int key = nums[first];
    // 當last和first重合時,整個數列都與key進行了比較,在此之前,必須不停地迴圈
    while (first < last) {
        // 把key右邊比key小的數放到key的左邊,此過程中last不停向數列中心靠攏
        while (first < last && nums[last] >= key) --last;
        nums[first] = nums[last];
        // 把key左邊比key大的數放到key的右邊,此過程中first不停向數列中心靠攏
        while (first < last && nums[first] <= key) ++first;
        nums[last] = nums[first];
    }
    // 把key裡存放的數放回first處
    nums[first] = key;
    // 對key左右的區間繼續進行遞迴
    quick_sort(nums, l, first);
    quick_sort(nums, first + 1, r);
}