演算法回顧系列第八篇:基數排序
基數排序
基本原理:
顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用。
基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。
程式實現:
/**
* radixsort:
* 分為lsd(least significant digital)或msd(most significant digital),
* lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始.
*/public class radixsort
system.out.println("各桶內元素分布:"+arrays.deeptostring(temp));
system.out.println("各桶內元素計數:"+arrays.tostring(order));
system.out.println("出桶:");
for(int i = 0; i < d; i++)
}order[i] = 0;//每個桶內元素複製完後,桶內元素計數清0.
}system.out.println("本趟出桶整理後:"+arrays.tostring(number));
current++;
currentvalue *= 10;//lsd方式每左移一位,該位代表的值*10.
k = 0;//每趟複製結束後,標記位歸0.
} }/**
* 取陣列內元素的最大長度
*/public static int getmaxnumberlength(int number)
if(length>maxlength)
} return maxlength; }
public static void main(string args) ;
radixsort.lsdsort(data, 10);
system.out.println("result:"+arrays.tostring(data));
}}
上面程式中:
從右向左依次作為排序依據位放入桶中,並記錄每個桶內的元素個數。
然後,按桶的順序將桶內元素寫入排序陣列內。
依此類推,直到最高位完成排序。
由於先做了低位的排序,所以當高位相等時,低位數字還是由小到大的順序入桶的,就是說入完桶還是有序的。
效能分析:o(d(n+radix)),n個記錄,d個關鍵碼,關鍵碼的取值範圍為radix.
空間複雜度:o(n)
穩定性:穩定。
排序演算法 八 基數排序
基數排序不需要直接比較數值的大小和直接在序列中交換資料,這個其他的排序演算法有很大的不同,它是根據數字中各位的值,通過對其進行分配收集來實現排序的。基數排序的原理很簡單易懂,下面給出乙個示例應該就能理解了。對於 29,9,14,87,92,199,283,183,65,43,6 3 這個序列進行ls...
演算法之基數排序
基數排序思想 利用個十百千等位數數字進行排序,不經過資料之間比較,以下 純手擼,實現起來還是比較簡單的,不過是第一次實現,不追求效率,只求實現。真個實現主要邏輯分為兩步,第一步把原始資料按照位數大小分配到二維陣列中,第二步再把二維陣列中資料按順序取出到原始陣列中,完成一次各位排序 接下來就是迴圈,依...
演算法 排序之基數排序
基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...