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

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

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

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

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

計數(shù)排序

學習基數(shù)排序之前首先學習計數(shù)排序。

計數(shù)排序假設每個元素都是在0到k之間的一個整數(shù)。

基數(shù)排序的基本思想,對于每個元素x,如果我們知道了小于x的元素的個數(shù),就可以確定輸出數(shù)組中元素x的位置,那么直接將元素x放到輸出數(shù)組中。比如有3小于x的元素,那在輸出數(shù)組中,x肯定位于第4個位置。

計數(shù)排序的算法用偽代碼描述為:

COUNTING-SORT(A,k)

// 初始化數(shù)組C

for i=0 to k

C[i]=0

// 統(tǒng)計A[j]元素出現(xiàn)的次數(shù),保存到C數(shù)組中

for j=0 to A.length

C[A[j]]=C[A[j]]+1

// 統(tǒng)計小于等于A[j]元素的個數(shù)

for k=0 to k

C[K]=C[K-1]+C[K]

// 將A中的元素放在B中正確的位置

for i=A.length to 0

B[C[A[i]]-1]=A[i]

C[A[i]]=C[A[i]]-1

注:由于有可能有相同元素存在,所以,每次將A[i]元素放入B數(shù)組中,都要將C[A[j]]的值減一,這樣當遇到下一個值等于A[j]的元素時,該元素就能放在輸出數(shù)組中A[j]的前面。

計數(shù)排序的詳細過程如下

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

計數(shù)排序的關鍵代碼如下

public int[] countSort(int a[], int k) {

int[] b = new int[a.length];

int[] c = new int[k];

for (int i = 0; i

c[i] = 0;

}

for (int i = 0; i

c[a[i]] += 1;

}

for (int i = 0; i

if (i != 0) {

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

}

}

for (int i = a.length - 1; i >= 0; i--) {

b[c[a[i]] - 1] = a[i];

c[a[i]] = c[a[i]] - 1;

}

return b;

}

計數(shù)排序的性能

很容易得到計數(shù)排序的時間復雜度為:T(n)=O(k+n),因此當k小于等于n,也就是當k=O(n),k和n同階時,采用計數(shù)排序的時間復雜度為T(n)=O(n)

同時,計數(shù)排序也是一種穩(wěn)定的排序算法。

基數(shù)排序

基數(shù)排序最初是用在打孔卡片制表機上的一種排序算法,由Herman Hollerith發(fā)明,也就是IBM的創(chuàng)始人。

基數(shù)排序從最低為開始來排序的,從低位到高位,按位排序,按位排序必須是穩(wěn)定的。

基數(shù)排序的詳細過程

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

基數(shù)排序算法描述

RADIX-SORT(A,d)

for i=1 to d

use a stable sort to sort arrat A on digit i

在這里我們選擇計數(shù)排序。考慮常規(guī)情況,對[0.。.9]之間的數(shù)排序,k=10,且一般有k<

基數(shù)排序的關鍵代碼,這里以數(shù)組排序時按照十進制每位進行比較。

/**

* 基數(shù)排序

* @param result 最終已排序的數(shù)組,共用一個節(jié)省空間

* @param maxLen 待排序的數(shù)組中最大的位數(shù)

*/

public static void radixSort(int[] a,int[] result, int maxLen) {

int flag = 1;

// 保存每輪要排序的位對應數(shù)組a的值

int [] digitArr = new int[a.length];

for(int i=0; i

// 共比較的輪數(shù)

flag *= 10;

// b數(shù)組中對應的裝著a數(shù)組中每位的數(shù),第一輪裝著各位,第二輪裝著十位數(shù)。。.

for (int j = 0; j < digitArr.length; j++) {

digitArr[j]=a[j]%flag;

digitArr[j]=digitArr[j]/(flag/10);

}

countSort(a, digitArr,result,10);

// 每一輪計數(shù)排序完后刷新下一輪要排序的數(shù)組

System.arraycopy(result, 0, a, 0,result.length);

}

}

調(diào)用計數(shù)排序的函數(shù)

/**

* 計數(shù)排序 :對數(shù)組a中的元素按某些位排序

* @param tmp 要參與排序的當前位的值保存在tmp中

* @param result 每次計數(shù)排序后的新的數(shù)組順序

*/

public static void countSort(int a[], int tmp[], int result[], int k) {

int[] c = new int[k];

for (int i = 0; i < c.length; i++) {

c[i] = 0;

}

for (int i = 0; i

c[tmp[i]] += 1;

}

for (int i = 0; i < c.length; i++) {

if (i != 0) {

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

}

}

for (int i = tmp.length - 1; i >= 0; i--) {

// 和計數(shù)排序唯一的差別在于賦值的時候用真實的數(shù)據(jù)

result[c[tmp[i]] - 1] = a[i];

c[tmp[i]] = c[tmp[i]] - 1;

}

}

基數(shù)排序的性能

如果基數(shù)排序使用的穩(wěn)定排序算法的時間復雜度為O(n+k),那么基數(shù)排序的時間復雜度為T(n)=O(d(n+k))

很容易理解要循環(huán)d輪,每輪耗時為O(n+k),于是總的耗時為O(d(n+k))

在此基礎上,從2^r進制來看,此時k為2^r,并且一個b位數(shù)要比較b/r輪。于是我們得到T(n)=O((b/r)(n+2^r))

對上式求導可得其最小值。此時r=lgn,此時T(n)=O((b/lgn)n),如果再取b=lgn,這時就能達到最少的運行時間,時間復雜度為T(n)=O(n)

基數(shù)排序也是穩(wěn)定的排序算法

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

    評論

    相關推薦

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實現(xiàn)思路,主要包含以下部分內(nèi)容:插入排序介紹插入排序算法實現(xiàn)手把手教你排序算法怎么寫在添加新
    的頭像 發(fā)表于 06-04 08:03 ?544次閱讀
    手把手教你<b class='flag-5'>排序</b>算法怎么寫

    用FPGA實現(xiàn)雙調(diào)排序的方法(2)

    典型的排序算法包括冒泡排序、選擇排序、插入排序、歸并排序、快速排序、希爾
    的頭像 發(fā)表于 03-21 10:28 ?525次閱讀
    用FPGA實現(xiàn)雙調(diào)<b class='flag-5'>排序</b>的方法(2)

    FPGA實現(xiàn)雙調(diào)排序算法的探索與實踐

    雙調(diào)排序(BitonicSort)是數(shù)據(jù)獨立(Data-independent)的排序算法,即比較順序與數(shù)據(jù)無關,特別適合并行執(zhí)行。在了解雙調(diào)排序算法之前,我們先來看看什么是雙調(diào)序列。
    發(fā)表于 03-14 09:50 ?399次閱讀
    FPGA實現(xiàn)雙調(diào)<b class='flag-5'>排序</b>算法的探索與實踐

    想聽聽48和大對數(shù)光纜的排序

    48芯光纜和大對數(shù)光纜都是光纜中的一種,它們的區(qū)別在于芯數(shù)不同。48芯光纜指的是光纜中包含48根光纖,而大對數(shù)光纜則是指光纜中芯數(shù)超過了48芯。 在實際的光纜應用中,不同芯數(shù)的光纜需要進行不同的排序
    的頭像 發(fā)表于 03-12 10:44 ?384次閱讀

    C語言實現(xiàn)經(jīng)典排序算法概覽

    冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。
    的頭像 發(fā)表于 02-25 12:27 ?367次閱讀
    C語言實現(xiàn)經(jīng)典<b class='flag-5'>排序</b>算法概覽

    十大排序算法總結

    排序算法是最經(jīng)典的算法知識。因為其實現(xiàn)代碼短,應該廣,在面試中經(jīng)常會問到排序算法及其相關的問題。一般在面試中最??嫉氖强焖?b class='flag-5'>排序和歸并排序等基本的排序
    的頭像 發(fā)表于 12-20 10:39 ?985次閱讀

    時間復雜度為O (nlogn)的排序算法簡述

    歸并排序遵循分治的思想:將原問題分解為幾個規(guī)模較小但類似于原問題的子問題,遞歸地求解這些子問題,然后合并這些子問題的解來建立原問題的解。
    的頭像 發(fā)表于 12-05 09:57 ?472次閱讀
    時間復雜度為O (nlogn)的<b class='flag-5'>排序</b>算法簡述

    數(shù)據(jù)結構:單鏈表的排序

    給定一個單鏈表的頭結點head(該結點有值),長度為n的無序單鏈表,對其按升序排序后,返回新鏈表。如當輸入鏈表 {3,1,4,5,2} 時,經(jīng)升序排列后,原鏈表變?yōu)?{1,2,3,4,5},對應的輸出為 {1,2,3,4,5}。
    的頭像 發(fā)表于 11-30 13:56 ?1134次閱讀
    數(shù)據(jù)結構:單鏈表的<b class='flag-5'>排序</b>

    使用LTC2937排序和監(jiān)督的分步指南

    電子發(fā)燒友網(wǎng)站提供《使用LTC2937排序和監(jiān)督的分步指南.pdf》資料免費下載
    發(fā)表于 11-24 14:39 ?0次下載
    使用LTC2937<b class='flag-5'>排序</b>和監(jiān)督的分步指南

    python升序和降序排序代碼

    Python是一種簡潔而強大的編程語言,提供了許多實用的函數(shù)和方法來排序數(shù)據(jù)。在本文中,我們將詳細討論Python中的升序和降序排序。我們將深入探討不同的排序算法、它們的復雜度以及如何
    的頭像 發(fā)表于 11-21 15:20 ?2282次閱讀

    嵌入式課程設計報告-數(shù)據(jù)排序過程演示

    電子發(fā)燒友網(wǎng)站提供《嵌入式課程設計報告-數(shù)據(jù)排序過程演示.doc》資料免費下載
    發(fā)表于 10-26 09:30 ?0次下載
    嵌入式課程設計報告-數(shù)據(jù)<b class='flag-5'>排序</b><b class='flag-5'>過程</b>演示

    排序算法有哪些

    合并 我們來具體看看例子,假設我們現(xiàn)在給定一個數(shù)組:[6,3,2,7,1,3,5,4],我們需要使用歸并算法對其排序,其大致過程如下圖所示: 分 階段可以理解為就是 遞歸拆分子序列 的過程,遞歸的深度為log2n。而治的階段則是
    的頭像 發(fā)表于 10-11 15:49 ?516次閱讀
    <b class='flag-5'>排序</b>算法有哪些

    FPGA排序-冒泡排序(Verilog版)介紹

    仍然以8個8bit的數(shù)為例來介紹冒泡排序,因此數(shù)據(jù)的輸入和輸出位寬均為64bit(8*8bit),使用valid信號來標識數(shù)據(jù)有效,整個實現(xiàn)采用流水線的方式。
    發(fā)表于 10-07 14:07 ?2116次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>(Verilog版)介紹

    jwt冒泡排序的原理

    jwt簡介 冒泡排序: (Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成一個小氣泡,根據(jù)氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。 冒泡
    的頭像 發(fā)表于 09-25 16:33 ?451次閱讀
    jwt冒泡<b class='flag-5'>排序</b>的原理

    排序算法之選擇排序

    選擇排序: (Selection sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。 選擇排序的原理: 一組無序待數(shù)組,做升序
    的頭像 發(fā)表于 09-25 16:30 ?1332次閱讀
    <b class='flag-5'>排序</b>算法之選擇<b class='flag-5'>排序</b>