日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

三向切分快速排序

發(fā)布時(shí)間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三向切分快速排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

在學(xué)習(xí)三向切分快速排序之前,我們先來(lái)了解一下 E.W.Dijlstra(Dijkstra最短路徑算法的發(fā)明者)曾經(jīng)提出的一個(gè)關(guān)于荷蘭國(guó)旗的問(wèn)題:

荷蘭國(guó)旗包含三種顏色:紅、白、藍(lán)。有這三種顏色的球,算法的目標(biāo)是將這三種球按荷蘭國(guó)旗顏色順序正確地排列,即紅白藍(lán)的順序排序。

這里我們使用0,1,2來(lái)表示紅、白、藍(lán)。要求時(shí)間復(fù)雜度為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; }

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

其實(shí)三向切分快速排序基本上也是這個(gè)思想,如下:

對(duì)比上面就是<V為紅色,=V為白色,>V為藍(lán)色。轉(zhuǎn)換為代碼就是:

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;} }

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

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。