問題描述:
給定乙個陣列,求排序之後的最大差值,且時間複雜度為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 輸出 ...