日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法之基数排序

發布時間:2024/2/28 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法之基数排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構與算法之基數排序


目錄

  • 基數排序介紹
  • 基數排序思想分析
  • 代碼實現
  • 基數排序的說明

  • 1. 基數排序介紹

  • 基數排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些“桶”中,達到排序的作用

  • 基數排序法是屬于穩定性的排序,基數排序法的是效率高的穩定性排序法

  • 基數排序(Radix Sort)是桶排序的擴展

  • 基數排序是1887年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按位數切割成不同的數字,然后按每個位數分別比較。


  • 2. 基數排序思想分析

  • 將所有待比較數值統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列。這樣說明,比較難理解,下面我們看一個圖文解釋,理解基數排序的步驟

  • 基數排序圖文說明
    將數組 {53, 3, 542, 748, 14, 214} 使用基數排序, 進行升序排序。



  • 3. 代碼實現

    import java.util.Arrays;public class RadixSort {public static void main(String[] args) {int[] arr = {53, 3, 542, 748, 14, 214};System.out.println("排序前:" + Arrays.toString(arr));radixSort(arr);System.out.println("排序前:" + Arrays.toString(arr));}//基數排序public static void radixSort(int[] arr) {//1.得到數組中最大的數的位數int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//2. 得到最大數是位數int maxLength = (max + "").length();//定義一個二維數組,表示10個桶,每個桶就是一個一維數組//說明//1. 二維數組包含10個一位數組//2. 為了防止在放入數的時候,數據溢出,則每個一位數組(桶),大小定arr.length//3. 明確,基數排序是使用空間換時間的經典算法int[][] bucket = new int[10][arr.length];//為了記錄每個桶中,實際存放了多少個數據,我們定義一個一位數組來記錄各個桶的每次放入的數據//bucketElementCount[0] 記錄的就是bucket[0]桶的放入數據的個數int[] bucketElementCount = new int[10];//使用循環將代碼處理for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {//針對每個元素的對應位進行排序處理for (int j = 0; j < arr.length; j++) {//取出每個元素的個數的值int digitOfElement = arr[j] / n % 10;//放入對應的桶中bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];bucketElementCount[digitOfElement]++;}//按照這個桶的順序(一維數組的下標依次取出數據,放入原來數組)int index = 0;//遍歷每一個桶,并將桶中輸入,放入到原數組for (int k = 0; k < bucketElementCount.length; k++) {//如果桶中有數據,我們才放入到原數組if (bucketElementCount[k] != 0) {//循環該桶即第k個桶(即第k個一維數組)放入for (int l = 0; l < bucketElementCount[k]; l++) {//取出元素放入arrarr[index++] = bucket[k][l];}}//第i+1輪處理后,需要將每個bucketElementCount[k]=0bucketElementCount[k] = 0;} // System.out.println("第"+(i+1)+"輪:"+Arrays.toString(arr));}} }

    編譯結果:


    4. 基數排序的說明:

  • 基數排序是對傳統桶排序的擴展,速度很快.

  • 基數排序是經典的空間換時間的方式,占用內存很大, 當對海量數據排序時,容易造成 OutOfMemoryError 。

  • 基數排序時穩定的。[注:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序算法是穩定的;否則稱為不穩定的]

  • 有負數的數組,我們不用基數排序來進行排序, 如果要支持負數,參考: https://code.i-harness.com/zh-CN/q/e98fa9

  • 總結

    以上是生活随笔為你收集整理的数据结构与算法之基数排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。