關於桶排序的演算法思想就不再敘述了,目前桶排序主要用於在o(n)的時間內處理正數的排序問題, 然而一旦遇到負數問題,就只能把數分成兩堆,對正負數分開去排序,這樣無疑比較麻煩。今天我做了乙個桶排序的題,對於輸入都是32位整形數列進行桶排序,值想到了乙個可以同時處理正負數的演算法。
通常我們的輸入都是十進位制數,桶排序都是設定為10個桶,從後向前每次對每乙個位進行排序,這樣雖然是o(n),但是除法操作會占用大量的時間。我的改進思路是將桶設定為16個,即2^4個桶,32位的int型整數看做16進製制是8位,最高位是符號位,這樣可以用移位操作代替除法操作,大大提高了效率。桶排序的空間複雜度是o(n) ,即需要開闢新陣列儲存所有的資料,桶的數量不影響空間複雜度。**如下:
void bucket_sort(vector& nums)
//迴圈七輪,進行桶排序
for (int i = 1; i < 8; i++)
//排序之後,交換正負數的位置
int pos = 0;
for (int i = 0; i < 8; i++) swap(bucket[i], bucket[i + 8]);
for (auto v : bucket)
for (auto i : v)
nums[pos++] = i;
}
唯一需要說明的就是,排序之後,由於負數的符號位是1,正數的符號位是0,所以0-7個桶存放的是正數,8-15個桶存放的是負數;除此之外,正數是從小到大排列的,負數由於是補碼存放,其絕對值為取反之後再加1,所以負數是按照絕對值從大到小排列的,即負數也是從小到大排列的。所以只需要把0-7桶放到8-15桶的後面,即可完成排序。 python負數的處理
python中的整形以補碼形式儲存。正數儲存是本身,負數的儲存形式是原碼的二進位制表示加上個負號。負數的補碼 負數 0xffffffff 負數補碼轉換為負數形式 a 0xffffffff print bin 3 0b11 print bin 3 0xffffffff 0b11111111111111...
桶排序的應用
題目 在乙個無序陣列中,求取有序之後相鄰數差值最大的在乙個無序陣列中,求取有序之後相鄰數差值最大的 要求 時間複雜度為o n 且存在資料範圍特別大 即不允許使用桶排序 解法 只是借鑑了桶的概念,而並沒有使用桶排序來求取。這一次是取決於給定的陣列中的元素個數,過程如下 1 陣列的大小是n,需要準備n ...
python 桶的排序
在技術排序中,如果元素的範圍比較 比如 在1到1億之間 如何改造演算法 桶排序 bucket sort 首先將元素分在不同的桶中,在對每個桶中的元素排序 n 表示預設分成多少桶 乙個桶放 max num n 的數 var max num n 得0放到0號桶裡,得1放到1號桶裡 當max num 10...