給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度0(n)
且要求不能用非基於比較的排序
那麼這道題就借用了桶排序的概念
#include
#include
intcompare_min
(int
,int);
//找到最小值
intcompare_max
(int
,int);
//找到最大值
int main ();
int n=
sizeof
(zippo)
/sizeof
(zippo[0]
);int w=n+1;
int min=zippo[0]
;int max=zippo[0]
;for
(int i=
0;i)int group=n+1;
//把組數設成整個陣列中元素的個數再+1
int bigcha=max-min+1;
//最大值和最小值的差
float try_count=bigcha/group;
//想確定每一組中到底要幾個數,當然了,又可能算出來的是小數
int count;
if(try_count==
(int
)try_count)
//如果是小數那麼就取整後+1
count=try_count;
else
count=try_count+1;
//萬事俱備,只差三個陣列
bool tong_1 [w]=;
//bool型別的陣列,沒有初始化之前都是0,用來判斷是否為空桶
int tong_min [w]=;
//如果不是空桶,那麼記下這個桶的最大值、最小值就好
int tong_max [w]=;
//3個陣列,縱觀為一組,記錄了乙個桶的狀態
for(
int i=
0;i)else
}int m=0;
for(
int i=
1;i<=
(n+1
);i++)}
for(
int k=i+
1;k<=
(n+1
);k++)}
}}printf
("%d"
,m);
return0;
}int
compare_min
(int min,
int a)
intcompare_max
(int max,
int a)
所以,桶的資訊都記錄好了之後就可以比較了
但是,比較的基準是非空桶與前後非空桶的比較,而非空桶與前後非空桶的比較
這是為什麼呢?
我們把桶數設成比陣列的元素個數多一的原因,就是要保障至少有乙個空桶,但是這個空桶的存在只是為了
排除題中所求是乙個桶中的最大值和最小值之差
那麼,以空桶為基準可不可以呢?當然不行,這邊呢,有乙個我自己手工畫的圖,肯定不好看,但是能看懂。。
假設:第乙個桶只在21–30之間有30乙個數,這種假設以此類推,那麼我們會發現第三個桶和第乙個桶差12,第三個桶和第四個桶之間差18
所以呢,由此即可證明,應該以非空桶為基準,以其最大值和後面非空桶的最小值比較,以其最小值和前面非空桶的最大值作比較
C 高頻面試題
malloc free是c語言的標準庫函式,new delete是c 的運算子。由於malloc free是庫函式而不是運算子,不在編譯器控制許可權之內。對於使用者自定義的物件而言,用maloc free無法滿足動態管理物件的要求。廢話 new是型別安全的,malloc不是。int a new fl...
C 高頻面試題
字首式可以返回物件的引用,而字尾式必須返回物件的值所以導致在大物件產生時產生了較大的複製開銷,因此處理自定義型別的時候盡量使用字首式。a b b a a b 相對於c,c 多了過載 內聯函式 異常處理,擴充套件了物件導向的設計內容 類 繼承 虛函式 模板。c 並不是完全的物件導向,它也可以寫出面向過...
STL高頻面試題
vector的內部是使用動態陣列的方式來實現的,如果動態陣列的內部實現不夠用,就要動態的重新分配記憶體。然後把原陣列的內容拷貝過去。vector和陣列類似,擁有連續的記憶體空間,支援隨機的訪問,在中間進行元素的插入和刪除的操作時間複雜度是o n list是由雙向鍊錶實現的,只能通過陣列指標來進行資料...