首先找到陣列a中的最大值;然後建立乙個長度為最大值加1的陣列;遍歷a陣列,如果a[i]的值為b,那麼新的陣列中下標為b的位置的值加1。
比如:a陣列是【1,2,2,4,3,2】,那麼新的陣列為【0,1,3,1,1】
分析:新陣列中o位置為0,說明a陣列中沒有0;1位置為1,說明a陣列中有1個1;2位置為3,說明a陣列有3個2;3位置為1,說明a陣列中有1個3;4位置為1,說明a陣列有1個4。
對原陣列進行一次遍歷(找到最大值),時間複雜度是o(n);
對原陣列進行第二次遍歷(進行裝桶操作),時間複雜度是o(n);
排好序有序輸出列印,遍歷所有的桶,時間複雜度是o(m);
其中n表示資料樣本的長度,m表示桶的個數;
桶排序的時間複雜度是o(n),額外的空間複雜度是o(n)。
public static void bucketsort(int arr)
//1.獲取陣列的最大值(遍歷一次原陣列)
int max=integer_min_value;
for(int i=0;i例題:
分析:要求是非基於比較的排序且時間複雜度是o(n),我們考慮使用堆排序。
1.首先遍歷原陣列,找到最大值和最小值。
2.建立乙個輔助陣列(桶的集合),長度為原陣列長度加1,o位置放原陣列的最小值,最後乙個位置放原陣列的最大值。
3.每個桶存放的要有三個陣列:存在原陣列中,並且被劃分到了該範圍內的最小值和最大值;乙個布林變數,用來表示該桶中有沒有元素。
4.遍歷原陣列,填充桶中的資料。
5.空桶存在的意義表示的是相鄰的差值最大的兩個數不可能在同乙個桶中,因為隔了乙個空桶。比較非空桶中的最小值和它前乙個非空桶的最大值的差值,非空桶中的最大值和它後乙個非空桶中的最小值的差值,比較這兩個數,取到乙個最大值。
//找到相鄰差值最大值的方法
public static int maxgap(int arr)
//2.遍歷陣列,找到陣列中的最大值和最小值
int max=integer.min_value;
int min=integer.max_value;
int len=arr.length;
for (int i = 0; i < arr.length; i++)
//3.考慮陣列的特殊內容問題(只有一種數)
if(min==max)
//4.建立好輔助的陣列,桶中應該有最大值,最小值和是否有值,並且長度是原陣列的長度加1
int maxs=new int[len+1];
int mins=new int[len+1];
boolean hasnum=new boolean[len+1];
//5.遍歷陣列,確定把陣列中的每個數都填充到那個桶裡面(bucket方法)(用bid來表示插入桶的座標)
int bid=0;
for(int i=0;i//7.尋找差值最大的值:遍歷輔助陣列,
int res=0;
int lastmax=maxs[0];//即使只有最小值,它也應該有數
int i=1;
for(;i<=len;i++)
}return res;
}//6.提供bucket方法,把陣列中的數字劃分到對應的桶中
public static int bucket(long num,long len,long max,long min)
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
線性排序之 計數排序
counting sort適用於排列分布比較集中的資料,即最大值和最小值相差不會太大,具體這個差在多少合適,還是以後值得我思考的問題?計數排序的演算法思想是需要分配3個陣列,original,counter original counter i counter i counter i 1 即計數為小...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...