包含負整數的桶排序

2021-08-11 08:13:54 字數 1198 閱讀 2607

我們平常所用的陣列桶排序,在資料分布較為均勻的情況下,在速度上相對很多排序都有著極大的優勢。但在處理負值時卻擁有短板。因為陣列的下標無法為負值。這裡,我提供了兩種解決方法:

1.int*a,i,max,min,dev,b[n];

min=max=b[0];

for(i=0;i

if(b[i]>max)

max=b[i];

else if(b[i]

min=b[i];

}dev=max-min+1;

a=(int *)calloc(dev,sizeof(int));

for(i=0;i

a[i]=0;

for(i=0;i

a[b[i]-min]++;

}for(i=0;i

for(j=0;j

printf("%d ",i+min);

}第一種方法是先取得最大值與最小值,然後算出最小值與0之間的偏移量以及最大值與最小值的差值。在之後的程式中便忽略掉此偏移。照常排序後,在最後結果處加上偏移量(即最小值)。

2.int *a,*fa,i,max,min,b[n];

min=max=b[0];

for(i=0;i

if(b[i]>max)

max=b[i];

else if(b[i]

min=b[i];

}if(max>0)

a=(int *)calloc(max+1,sizeof(int));

if(min<=0)

fa=(int *)calloc(-min+1,sizeof(int));

for(i=0;i

a[i]=0;

for(i=0;i<-min+1;i++)

fa[i]=0;

for(i=0;i

if(b[i]>0)

a[b[i]]++;

else

fa[-b[i]]++;

}for(i=-min+1;i>=0;i--)

for(i=0;i

for(j=0;j

printf("%d ",i);

}第二種方法同樣也要取最大值與最小值,但不同的是,這次要建立兩個陣列。然後分別儲存正數與負數和0。在處理負數時,也將其視為正數處理。再遍歷完整個陣列後,再將兩陣列分別輸出。

經過實驗,兩演算法時間消耗所差無幾。所以在對整數範圍進行桶排序時,兩方法均可使用。

負整數移位的問題驗證

對於乙個正整數,移位都比較清楚,但對乙個負數移位的結果如何呢?直接做測試,如下 unsigned short value test int result test value test 0xe100 31 8 result test short value test 8 printf 31 8 8 ...

桶排序的應用

題目 在乙個無序陣列中,求取有序之後相鄰數差值最大的在乙個無序陣列中,求取有序之後相鄰數差值最大的 要求 時間複雜度為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...