在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基數(shù)排序知識點全面概括

lhl545545 ? 來源:電子發(fā)燒友網(wǎng) ? 2018-02-05 14:30 ? 次閱讀

數(shù)據(jù)背景

在基數(shù)排序中,我們不能再只用一位數(shù)的序列來列舉示例了。一位數(shù)的序列對基數(shù)排序來說就是一個計數(shù)排序。

這里我們列舉無序序列 T = [ 2314, 5428, 373, 2222, 17 ]

排序原理

上面說到基數(shù)排序不需要進行元素的比較與交換。如果你有一些算法的功底,或者豐富的項目經(jīng)驗,我想你可能已經(jīng)想到了這可能類似于一些“打表”或是哈希的做法。而計數(shù)排序則是打表或是哈希思想最簡單的實現(xiàn)。

計數(shù)排序

計數(shù)排序的核心思想是,構(gòu)建一個足夠大的數(shù)組 hashArray[],數(shù)組大小需要保證能夠把所有元素都包含在這個數(shù)組上 。

假設(shè)我們有無序序列 T = [ 2314, 5428, 373, 2222, 17 ]

首先初始化數(shù)組 hashArray[] 為一個全零數(shù)組。當然,在 Java 里,這一步就不需要了,因為默認就是零了。

在對序列 T 進行排序時,只要依次讀取序列 T 中的元素,并修改數(shù)組 hashArray[] 中把元素值對應(yīng)位置上的值即可。這一句有一些繞口。打個比方,我們要把 T[0] 映射到 hashArray[] 中,就是 hashArray[T[0]] = 1. 也就是 hashArray[2314] = 1. 如果序列 T 中有兩個相同元素,那么在 hashArray 的相應(yīng)位置上的值就是 2。

下圖是計數(shù)排序的原理圖:

(假設(shè)有無序序列:[ 5, 8, 9, 1, 4, 2, 9, 3, 7, 1, 8, 6, 2, 3, 4, 0, 8 ])

基數(shù)排序知識點全面概括

基數(shù)排序原理圖

上面的計數(shù)排序只是一個引導(dǎo),好讓你可以循序漸進地了解基數(shù)排序。

基數(shù)排序知識點全面概括

上面這幅圖,或許你已經(jīng)在其他的博客里見到過。這是一個很好的引導(dǎo)跟說明。在基數(shù)排序里,我們需要一個很大的二維數(shù)組,二維數(shù)組的大小是 (10 * n)。10 代表的是我們每個元素的每一位都有 10 種可能,也就是 10 進制數(shù)。在上圖中,我們是以每個數(shù)的個位來代表這個數(shù),于是,5428 就被填充到了第 8 個桶中了。下次再進行填充的時候,就是以十位進行填充,比如 5428 在此時,就會選擇以 2 來代表它。

基數(shù)排序知識點全面概括

算法優(yōu)化

在算法的原理中,我們是以一張二維數(shù)組的表來存儲這些無序的元素。使用二維數(shù)組有一個很明顯的不足就是二維數(shù)組太過稀疏。數(shù)組的利用率為 10%。

在尋求優(yōu)化的路上,我們想到一種可以壓縮空間的方法,且時間復(fù)雜度并沒有偏離得太厲害。那就是設(shè)計了兩個輔助數(shù)組,一個是 count[],一個是 bucket[]。count 用于記錄在某個桶中的最后一個元素的下標,然后再把原數(shù)組中的元素計算一下它應(yīng)該屬于哪個“桶”,并修改相應(yīng)位置的 count 值。直到最大數(shù)的最高位也被添加到桶中,或者說,當所有的元素都被被在第 0 個桶中,基數(shù)排序就結(jié)束了。

優(yōu)化后的原理圖如下:

基數(shù)排序知識點全面概括

算法實現(xiàn)

import org.algorithm.array.sort.interf.Sortable;

/**

*

* 基數(shù)排序/桶排序

*

*

* @author Q-WHai

* @see http://blog.csdn.net/lemon_tree12138

* @version 0.1.1

*/

public class RadixSort implements Sortable {

@Override

public int[] sort(int[] array) {

if (array == null) {

return null;

}

int maxLength = maxLength(array);

return sortCore(array, 0, maxLength);

}

private int[] sortCore(int[] array, int digit, int maxLength) {

if (digit >= maxLength) {

return array;

}

final int radix = 10; // 基數(shù)

int arrayLength = array.length;

int[] count = new int[radix];

int[] bucket = new int[arrayLength];

// 統(tǒng)計將數(shù)組中的數(shù)字分配到桶中后,各個桶中的數(shù)字個數(shù)

for (int i = 0; i < arrayLength; i++) {

count[getDigit(array[i], digit)]++;

}

// 將各個桶中的數(shù)字個數(shù),轉(zhuǎn)化成各個桶中最后一個數(shù)字的下標索引

for (int i = 1; i < radix; i++) {

count[i] = count[i] + count[i - 1];

}

// 將原數(shù)組中的數(shù)字分配給輔助數(shù)組 bucket

for (int i = arrayLength - 1; i >= 0; i--) {

int number = array[i];

int d = getDigit(number, digit);

bucket[count[d] - 1] = number;

count[d]--;

}

return sortCore(bucket, digit + 1, maxLength);

}

/*

* 一個數(shù)組中最大數(shù)字的位數(shù)

*

* @param array

* @return

*/

private int maxLength(int[] array) {

int maxLength = 0;

int arrayLength = array.length;

for (int i = 0; i < arrayLength; i++) {

int currentLength = length(array[i]);

if (maxLength < currentLength) {

maxLength = currentLength;

}

}

return maxLength;

}

/*

* 計算一個數(shù)字共有多少位

*

* @param number

* @return

*/

private int length(int number) {

return String.valueOf(number).length();

}

/*

* 獲取 x 這個數(shù)的 d 位數(shù)上的數(shù)字

* 比如獲取 123 的 0 位數(shù),結(jié)果返回 3

*

* @param x

* @param d

* @return

*/

private int getDigit(int x, int d) {

int a[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

return ((x / a[d]) % 10);

}

}

基數(shù)排序過程圖

如果我們的無序是 T = [ 2314, 5428, 373, 2222, 17 ],那么其排序的過程就如下兩幅所示。

基數(shù)排序過程圖-1

基數(shù)排序知識點全面概括

基數(shù)排序過程圖-2

基數(shù)排序知識點全面概括

復(fù)雜度分析

基數(shù)排序知識點全面概括

其中,d 為位數(shù),r 為基數(shù),n 為原數(shù)組個數(shù)。

在基數(shù)排序中,因為沒有比較操作,所以在復(fù)雜上,最好的情況與最壞的情況在時間上是一致的,均為 O(d * (n + r))。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經(jīng)常使用一種算法,常見的排序算法有插入排序、希爾排序、選擇排序、冒泡排序、歸
    發(fā)表于 07-17 10:12 ?1130次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介紹

    資料下載:基數(shù)排序:*** 與 MSD

    1.算法原理基數(shù)排序是通過“分配”和“收集”過程來實現(xiàn)排序。1)分配,先從個位開始,根據(jù)位值(0-9)分別放到0~9號桶中(比如53,個位為3,則放入3號桶中)2)收集,再將放置在0~9號桶中的數(shù)據(jù)
    發(fā)表于 07-05 07:57

    算法的原理是什么?基數(shù)排序是如何實現(xiàn)的?

    算法的原理是什么?基數(shù)排序是如何實現(xiàn)的?有哪幾種方法可以實現(xiàn)基數(shù)排序
    發(fā)表于 07-05 07:42

    高一數(shù)學知識點總結(jié)

    高一數(shù)學知識點總結(jié)高一數(shù)學知識點總結(jié)高一數(shù)學知識點總結(jié)
    發(fā)表于 02-23 15:27 ?0次下載

    高二數(shù)學知識點總結(jié)

    高二數(shù)學知識點總結(jié)高二數(shù)學知識點總結(jié)高二數(shù)學知識點總結(jié)
    發(fā)表于 02-23 15:27 ?0次下載

    復(fù)習圖像處理知識點

    中南大學數(shù)字圖像預(yù)處理復(fù)習知識點,里面包含里所有的考點,可以參考。很全面
    發(fā)表于 05-10 15:48 ?0次下載

    PWM知識點詳解

    PWM知識點
    發(fā)表于 03-16 08:00 ?44次下載

    基數(shù)排序是怎么排的_基數(shù)排序詳細過程

    基數(shù)排序詳細過程如下文所述。基數(shù)排序最初是用在打孔卡片制表機上的一種排序算法,基數(shù)排序從最低為開始來排序的,從低位到高位,按位
    的頭像 發(fā)表于 02-05 14:11 ?1.7w次閱讀
    <b class='flag-5'>基數(shù)排序</b>是怎么排的_<b class='flag-5'>基數(shù)排序</b>詳細過程

    基數(shù)排序 java代碼實現(xiàn)

    本文詳細概括基數(shù)排序以及java代碼實現(xiàn)。基數(shù)排序又稱桶排序,相對于常見的比較排序基數(shù)排序
    發(fā)表于 02-05 14:46 ?1008次閱讀
    <b class='flag-5'>基數(shù)排序</b> java代碼實現(xiàn)

    C語言實現(xiàn)簡單的基數(shù)排序

    本文主要闡述的類容是C語言實現(xiàn)簡單的基數(shù)排序。基數(shù)排序是一種分配排序,其基本思想是:排序過程無須比較關(guān)鍵字,而是通過“分配”和“收集”過程來實現(xiàn)排序
    發(fā)表于 02-05 14:57 ?1803次閱讀
    C語言實現(xiàn)簡單的<b class='flag-5'>基數(shù)排序</b>

    常用的非比較排序算法:計數(shù)排序基數(shù)排序,桶排序的詳細資料概述

    這篇文章中我們來探討一下常用的非比較排序算法:計數(shù)排序基數(shù)排序,桶排序。在一定條件下,它們的時間復(fù)雜度可以達到O(n)。
    的頭像 發(fā)表于 06-18 15:11 ?7176次閱讀
    常用的非比較<b class='flag-5'>排序</b>算法:計數(shù)<b class='flag-5'>排序</b>,<b class='flag-5'>基數(shù)排序</b>,桶<b class='flag-5'>排序</b>的詳細資料概述

    嵌入式知識點總結(jié)

    嵌入式知識點總結(jié)(arm嵌入式開發(fā)led過程)-嵌入式知識點總結(jié)? ? ? ? ? ? ? ? ? ??
    發(fā)表于 07-30 14:20 ?23次下載
    嵌入式<b class='flag-5'>知識點</b>總結(jié)

    詳解射頻微波基礎(chǔ)知識點

    詳解射頻微波基礎(chǔ)知識點
    的頭像 發(fā)表于 01-29 10:28 ?2427次閱讀

    數(shù)字電路知識點總結(jié)

    本文整理了數(shù)字電路課程中的相關(guān)基本的知識點和較為重要的知識點,用于求職的數(shù)電部分的知識準備,差缺補漏。
    的頭像 發(fā)表于 05-30 15:07 ?4992次閱讀
    數(shù)字電路<b class='flag-5'>知識點</b>總結(jié)

    STM32 RTOS知識點

    電子發(fā)燒友網(wǎng)站提供《STM32 RTOS知識點.pdf》資料免費下載
    發(fā)表于 08-01 14:28 ?3次下載
    STM32 RTOS<b class='flag-5'>知識點</b>
    主站蜘蛛池模板: 亚洲 欧美 丝袜 制服 在线| 色多多官网| 在线免费看污视频| 亚洲一区小说区中文字幕| 日美一级毛片| 超h 高h 污肉1v1御书屋| 亚洲天堂免费| 色婷婷免费视频| 天天看黄| 天堂va欧美ⅴa亚洲va一国产| 久久精品9| 国产亚洲视频在线播放大全| 波多野结衣在线免费视频| 男人的天堂色偷偷之色偷偷| 美女一级毛片毛片在线播放| 色多多免费视频观看区一区| 欧美一区二区三区高清视频| 狠狠综合欧美综合欧美色| 亚洲午夜久久久精品影院| 美女操网站| 国产精品伦子一区二区三区| 美日韩一级| 复古毛片| 视频福利网| 日本乱妇| 在线观看国产日本| 69久久夜色精品国产69小说| 香蕉视频黄色片| 欧美成人精品一区二区| 欧美日韩一区二区三区视频| 国产真实乱偷人视频| 天天做天天爱天天综合网| 高颜值露脸极品在线播放| 欧美一区二区不卡视频| 美女用手扒开尿口给男生桶爽| 一级毛片看真人在线视频| 欧美福利片在线观看| 999毛片免费观看| 国产福利久久| 在线网址你懂的| 免看乌克兰a一级|