日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

三向切分快速排序

發布時間:2025/4/16 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三向切分快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們知道快速排序的應用非常廣泛,也許你可以非常熟練的可以寫出一個快速排序,在大多數情況下快速排序是可以適用的,但是快速排序還有一個改進的算法稱為三向切分快速排序,它是快速排序的一個變種,尤其適合在數據大量重復的情況下使用,它對快速排序性能的提升程度取決于重復數字的多少,平均時間復雜度介于N和NlogN之間。

在學習三向切分快速排序之前,我們先來了解一下 E.W.Dijlstra(Dijkstra最短路徑算法的發明者)曾經提出的一個關于荷蘭國旗的問題:

荷蘭國旗包含三種顏色:紅、白、藍。有這三種顏色的球,算法的目標是將這三種球按荷蘭國旗顏色順序正確地排列,即紅白藍的順序排序。

這里我們使用0,1,2來表示紅、白、藍。要求時間復雜度為O(n);
例如:

Input: [2,0,2,1,1,0] Output: [0,0,1,1,2,2]

解決方法如下:

public void sortColors(int[] nums) {int zero = -1, one = 0, two = nums.length;while (one < two) {if (nums[one] == 0) {swap(nums, ++zero, one++);} else if (nums[one] == 2) {swap(nums, --two, one);} else {++one;}} }private void swap(int[] nums, int i, int j) {int t = nums[i];nums[i] = nums[j];nums[j] = t; }

可以看到它使用了三個指針,分別代表三個不同的顏色。one指向未知的顏色,之后判斷,如果是紅色則和zero交換,如果是藍色則和two交換。最后數組中的情況如下:

其實三向切分快速排序基本上也是這個思想,如下:

對比上面就是<V為紅色,=V為白色,>V為藍色。轉換為代碼就是:

public class Solution{public int[] threeWayQuickSort(int[] a){int[] array = new int[a.length];System.arraycopy(a, 0, array, 0, a.length); sort(array, 0, a.length - 1);return array;}private void sort(int[] a, int lo, int hi){if(lo >= hi) return;int lt = lo - 1;int i = lo;int gt = hi + 1;int v = a[lo];while(i < gt){if(a[i] < v){swap(a, ++lt, i++);}else if(a[i] > v){swap(a, --gt, i);}else{i++;}}sort(a, lo, lt);sort(a, gt, hi);}private void swap(int[] a, int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;} }

最后,在編寫三向切分快速排序的時候要尤其注意數組下標的正確與否,這里的下標寫法,我們使用的是上面解決荷蘭國旗的下標寫法。

總結

以上是生活随笔為你收集整理的三向切分快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。