確定待排序數列(n個數)的最小值和最大值,確定桶的數量k;然後把這個n個數「均勻的」放到k個桶中;再對每個桶中的數列進行排序(可以使用其他排序演算法);最後依次讀取每個桶中的數就是排好序的整個數列。
使用乙個對映函式來達到把n個數放到k個桶的操作,其規則是「左側」桶(先放置的)中的數全部小於「右側」桶中的數列,即每個桶都有乙個取值範圍(如:第乙個桶存放1-5,第二個桶存放6-10),不在這個範圍的就是乙個空桶。
private static void main(string args)
system.out.println("待排序陣列:" + arrays.tostring(arr));
sort(arr);
system.out.println("最終結果:" + arrays.tostring(arr));
}/**
* 排序演算法
** @param arr 待排序陣列
* @param bucketsize 乙個桶中存放的數量
*/private static void sort(int arr, int bucketsize)
if (arr[i] > max)
}// 如果最大值和最小值相等,說明整個待排序陣列就是同乙個數
if (min == max)
// 確定桶的數量
int count = (int) math.floor((max- min) / bucketsize) + 1;
// 定義桶;利用list可以防止不確定每個桶存放數的數量,也可以避免每次都要擴充陣列
list> bucket = new arraylist<>();
for (int i = 0; i < count; i++)
// 把待排序數列放到桶裡
for (int i = 0; i < arr.length; i++)
// 對每個桶進行希爾排序
for (int i = 0; i < bucket.size(); i++)
}// 排列
int k = 0;
for (int i = 0; i < bucket.size(); i++)
}}/**
* 應用於每個桶中的排序演算法
*/private static void shellsort(integer arr, int left, int right)
int mid = (left + right) / 2;
shellsort(arr, left, mid);
shellsort(arr, mid + 1, right);
for (int i = left; i < right; i++) }}
}
時間複雜度
空間複雜度:o(n+k)
穩定性:穩定
資料探勘BUC演算法實現
根據給定的資料集,遞迴計算從0維到最大維的元組出現次數,若大於等於min sup,則加入結果,若小於min sup,則剪枝。舉個例子 資料集如下 a1,b1 a1,b2 a2,b1 a1,b2 min sup取2。0維到1維 從0 1維有a1,a2,b1,b2,四個元組。出現次數分別為a1 3,a2...
BUC冰川演算法的python實現
生成資料的方法 def datainit a a1 a2 a3 a4 a5 b b1 b2 b3 b4 c c1 c2 c3 d d1 d2 datalist for i in range 21 ax random.randint 0,4 bx random.randint 0,3 cx rando...
Algorithm 排序演算法
閒來無事回顧一下原來所學的排序演算法,包括冒泡 選擇 插入 希爾 快速 歸併排序,這六種。首先依次講解原理,最後放出實現及測試速度原始碼。我想大部分人學習的第乙個排序演算法就是這個。顧名思義,如泡泡般,越到水面就越大,即經過連續不斷的判斷,選取大 或小 的值進行交換,一輪結束後,未排序資料最後面的就...