演算法學習7 桶排序的例題 相鄰兩數最大

2021-10-01 11:55:28 字數 1486 閱讀 6396

問題描述:

給定乙個陣列,求排序之後的最大差值,且時間複雜度為o(n),額外空間複雜度為o(1)的演算法,且要求不能用非比較的排序演算法。

將待排序元素劃分到不同的桶。先掃瞄一遍序列求出最大值 maxv 和最小值 minv ,設桶的個數為 k ,則把區間 [minv, maxv] 均勻劃分成 k +1個區間,每個區間就是乙個桶。將序列中的元素分配到各自的桶。

2.根據鴿籠原理(鴿籠原理簡單表述:若有n個籠子和n+1只鴿子,所有的鴿子都被關在鴿籠裡,那麼至少有乙個籠子有至少2只鴿子。推廣:如果要把n個物件分配到m個容器中,必有至少乙個容器容納至少⌈n / m⌉個物件。(⌈x⌉大於等於x的最小的整數))可以得知至少有乙個空桶(空桶的意義在於否定最大插值在同乙個桶**現),

3.去遍歷一遍陣列,去記錄每個桶中的最大值和最小值及每個桶是否是空桶.

4.去找相鄰兩個桶的最大差值(及後乙個桶的最小值和相鄰的前乙個非空桶的最大值)

5.最後結果即在這些記錄的最大值中.即找出這些跨桶最大值中的最大值.

#include

#include

using

namespace std;

//求出每乙個數所在的桶的編號

intbocketnum

(int a,

int i,

int min,

int max,

int len)

intmin

(int a,

int b)

intmax

(int a,

int b)

intmaxgap

(int a,

int n)

int* minarr =

newint

[n+1](

);//記錄每個桶中的最小數

int* maxarr =

newint

[n+1](

);//記錄每個桶中的最大數

bool hasnum[n+1]

=;//記錄桶中是否有數

for(

int i =

0; i < n;

++i)

int maxgap =0;

//記錄最大差值

int lastmax =0;

//記錄當前空桶的上乙個桶的最大值

int i =0;

while

(i < n +1)

delete

minarr;

delete

maxarr;

return maxgap;

}int

main

(void

)for

(int i=

0;i) cout

maxgap

(p,number)

}

演算法學習03 桶排序

首先遍歷陣列,找到最大值與最小值,設定乙個長度為最大值 最小值 1的陣列,再次遍歷這個陣列,以當前值 最小值作為下標,將該下標的計數器增1。掃瞄一遍計數器陣列,按順序將值收集起來。舉個例子 nums 2,4,3,4,7 遍歷一次陣列,找到陣列元素的最小值與最大值分別為2和7,那麼我們設定乙個長度為7...

python演算法學習之桶排序演算法例項 分塊排序

複製 如下 coding utf 8 def insertion sort a 插入排序,作為桶排序的子排序 n len a if n 1 return a b 結果列表 for a in a i len b while i 0 and b i 1 a i i 1 b.insert i,a retu...

LeetCode演算法學習二 兩數相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...