桶排序的應用

2021-09-11 05:22:01 字數 1602 閱讀 3642

題目

在乙個無序陣列中,求取有序之後相鄰數差值最大的在乙個無序陣列中,求取有序之後相鄰數差值最大的

要求:時間複雜度為o(n),且存在資料範圍特別大(即不允許使用桶排序)

解法:只是借鑑了桶的概念,而並沒有使用桶排序來求取。這一次是取決於給定的陣列中的元素個數,過程如下:

(1)陣列的大小是n,需要準備n+1個桶來劃分

(2)求取陣列中的最大值maxn和最小值minn,並且保證最小值一定在0號桶,最大值一定在n號桶

(3)將(maxn-minn)/(n+1)作為乙個區域劃分,可以稱為range,將陣列中的數根據range填入相應的桶中

(4)申請n+1個桶,維護三個陣列作為標記,標記桶中的最大值和最小值,以及該桶是否為空桶。

同時陣列中的元素要進入的桶編號bid = (num-min)*len/(max-min)

(5)由於申請了n+1個桶,所以至少有乙個桶是空的,那麼相鄰的數可能在乙個桶中,也有可能在不同的桶中。在同乙個桶中的任何兩個數的差值都不會大於值range,並且空桶兩邊的非空桶,即左邊桶的max值和右邊桶的min值肯定大於range。可知maxgap必然來自不同的桶中。所以掃一遍相鄰的非空桶的(右邊桶)min值減去(左邊桶)max值 = ans,取ans的max值

注意一點:最大差值未必來自空桶兩則的非空桶,空桶兩側只是用於證明一下桶內差必然<=range

如下圖:

3. 舉個例子

給定陣列arr[5] = 

可知min = 0, max = 10

則range = (max-min)/(n+1) = 5/3

所以區間劃分是如下圖:(保證min在0號桶,max在n號桶)

//使用long型別使為了避免相乘的時候資料溢位

int bucketid(long num, long len, long maxn, long minn)

int maxgap(int a,int len)

if(maxn == minn)

return 0;

bool hasnum[len+1] = ;

int minnum[len+1] = ;

int maxnum[len+1] = ;

int buckid = 0;

for(int i = 0; i < len; ++i)

int res = 0;

int lastmax = maxnum[0];

for(int i = 1; i <= len; ++i)

}return res;

}int main()

; int ans = maxgap(a,5);

cout<

return 0;

}

排序 桶排序

首先,桶排序是一種簡單並且執行快的一種排序。第一步,對五個數進行排序。程式如下 include using namespace std int main 首先對陣列進行歸零 for int j 1 j 5 j 將輸入的數的個數存入陣列中。for int k 1 k 10 k 執行原理 桶排序,就是先...

桶排序在海量資料中的應用

題目1 一年的全國高考考生人數為500 萬,分數使用標準分,最低100 最高900 沒有小數,你把這500 萬元素的陣列排個序。分析 對500w資料排序,如果基於比較的先進排序,平均比較次數為o 5000000 log5000000 1.112億。方法 建立801 900 100 個桶。將每個考生的...

python 桶的排序

在技術排序中,如果元素的範圍比較 比如 在1到1億之間 如何改造演算法 桶排序 bucket sort 首先將元素分在不同的桶中,在對每個桶中的元素排序 n 表示預設分成多少桶 乙個桶放 max num n 的數 var max num n 得0放到0號桶裡,得1放到1號桶裡 當max num 10...