最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Radix Sort基數(shù)排序算法思想及C語言實(shí)現(xiàn)示例

 更新時(shí)間:2016年07月06日 16:19:41   作者:zhoutk  
基數(shù)排序和桶排序、計(jì)數(shù)排序共同是三種最常用的線性排序算法,這里我們就來深入解析Radix Sort基數(shù)排序算法思想及C語言實(shí)現(xiàn)示例,需要的朋友可以參考下

基本思想:

將待排數(shù)據(jù)中的每組關(guān)鍵字依次進(jìn)行桶分配。
具體示例:

278、109、063、930、589、184、505、269、008、083

我們將每個(gè)數(shù)值的個(gè)位,十位,百位分成三個(gè)關(guān)鍵字: 278 -> k1(個(gè)位)=8,k2(十位)=7,k3=(百位)=2。

然后從最低位個(gè)位開始(從最次關(guān)鍵字開始),對所有數(shù)據(jù)的k1關(guān)鍵字進(jìn)行桶分配(因?yàn)椋總€(gè)數(shù)字都是 0-9的,因此桶大小為10),再依次輸出桶中的數(shù)據(jù)得到下面的序列。

930、063、083、184、505、278、008、109、589、269

再對上面的序列接著進(jìn)行針對k2的桶分配,輸出序列為:

505、008、109、930、063、269、278、083、184、589

最后針對k3的桶分配,輸出序列為:

008、063、083、109、184、269、278、505、589、930

效率分析:

基數(shù)排序的性能比桶排序要略差。每一次關(guān)鍵字的桶分配都需要O(N)的時(shí)間復(fù)雜度,而且分配之后得到新的關(guān)鍵字序列又需要O(N)的時(shí)間復(fù)雜度。假如待排數(shù)據(jù)可以分為d個(gè)關(guān)鍵字,則基數(shù)排序的時(shí)間復(fù)雜度將是O(d*2N) ,當(dāng)然d要遠(yuǎn)遠(yuǎn)小于N,因此基本上還是線性級別的?;鶖?shù)排序的空間復(fù)雜度為O(N+M),其中M為桶的數(shù)量。一般來說N>>M,因此額外空間需要大概N個(gè)左右。

但是,對比桶排序,基數(shù)排序每次需要的桶的數(shù)量并不多。而且基數(shù)排序幾乎不需要任何“比較”操作,而桶排序在桶相對較少的情況下,桶內(nèi)多個(gè)數(shù)據(jù)必須進(jìn)行基于比較操作的排序。因此,在實(shí)際應(yīng)用中,基數(shù)排序的應(yīng)用范圍更加廣泛。


舉例:
假設(shè)我們有一些二元組(a,b),要對它們進(jìn)行以a為首要關(guān)鍵字,b的次要關(guān)鍵字的排序。我們可以先把它們先按照首要關(guān)鍵字排序,分成首要關(guān)鍵字相同的若干堆。然后,在按照次要關(guān)鍵值分別對每一堆進(jìn)行單獨(dú)排序。最后再把這些堆串連到一起,使首要關(guān)鍵字較小的一堆排在上面。按這種方式的基數(shù)排序稱為MSD(Most Significant Dight)排序。

第二種方式是從最低有效關(guān)鍵字開始排序,稱為LSD(Least Significant Dight)排序。首先對所有的數(shù)據(jù)按照次要關(guān)鍵字排序,然后對所有的數(shù)據(jù)按照首要關(guān)鍵字排序。要注意的是,使用的排序算法必須是穩(wěn)定的,否則就會取消前一次排序的結(jié)果。由于不需要分堆對每堆單獨(dú)排序,LSD方法往往比MSD簡單而開銷小。下文介紹的方法全部是基于LSD的。

通常,基數(shù)排序要用到計(jì)數(shù)排序或者桶排序。使用計(jì)數(shù)排序時(shí),需要的是Order數(shù)組。使用桶排序時(shí),可以用鏈表的方法直接求出排序后的順序。下面是一段用桶排序?qū)ΧM基數(shù)排序的程序:


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
struct data
{
  int key[2];
};
struct linklist
{
  linklist *next;
  data value;
  linklist(data v,linklist *n):value(v),next(n){}
  ~linklist() {if (next) delete next;}
};
void BucketSort(data *A,int N,int K,int y)
{
  linklist *Bucket[101],*p;//建立桶
  int i,j,k,M;
  M=K/100+1;
  memset(Bucket,0,sizeof(Bucket));
  for (i=1;i<=N;i++)
  {
    k=A[i].key[y]/M; //把A中的每個(gè)元素按照的范圍值放入對應(yīng)桶中
    Bucket[k]=new linklist(A[i],Bucket[k]);
  }
  for (k=j=0;k<=100;k++)
  {
    for (p=Bucket[k];p;p=p->next) j++;
    for (p=Bucket[k],i=1;p;p=p->next,i++)
      A[j-i+1]=p->value; //把桶中每個(gè)元素取出
    delete Bucket[k];
  }
}
void RadixSort(data *A,int N,int K)
{
  for (int j=1;j>=0;j--) //從低優(yōu)先到高優(yōu)先 LSD
    BucketSort(A,N,K,j);
}
int main()
{
  int N=100,K=1000,i;
  data *A=new data[N+1];
  for (i=1;i<=N;i++)
  {
    A[i].key[0]=rand()%K+1;
    A[i].key[1]=rand()%K+1;
  }
  RadixSort(A,N,K);
  for (i=1;i<=N;i++)
    printf("(%d,%d) ",A[i].key[0],A[i].key[1]);
  printf("\n");
  return 0;
}

基數(shù)排序是一種用在老式穿卡機(jī)上的算法。一張卡片有80列,每列可在12個(gè)位置中的任一處穿孔。排序器可被機(jī)械地"程序化"以檢查每一迭卡片中的某一列,再根據(jù)穿孔的位置將它們分放12個(gè)盒子里。這樣,操作員就可逐個(gè)地把它們收集起來。其中第一個(gè)位置穿孔的放在最上面,第二個(gè)位置穿孔的其次,等等。

對于一個(gè)位數(shù)有限的十進(jìn)制數(shù),我們可以把它看作一個(gè)多元組,從高位到低位關(guān)鍵字重要程度依次遞減。可以使用基數(shù)排序?qū)σ恍┪粩?shù)有限的十進(jìn)制數(shù)排序。

相關(guān)文章

  • C++ Easylogging++日志庫配置使用超詳細(xì)講解

    C++ Easylogging++日志庫配置使用超詳細(xì)講解

    這篇文章主要介紹了C++ Easylogging++日志庫配置使用,Easylogging++是用于C++應(yīng)用程序的單頭高效日志庫。它非常強(qiáng)大,高度可擴(kuò)展并且可以根據(jù)用戶的要求進(jìn)行配置
    2022-11-11
  • 基于C++實(shí)現(xiàn)酒店管理系統(tǒng)

    基于C++實(shí)現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • COLORREF,COLOR,RGB,CString的轉(zhuǎn)化總結(jié)分析

    COLORREF,COLOR,RGB,CString的轉(zhuǎn)化總結(jié)分析

    實(shí)際的軟件開發(fā)過程中,常需要用到非.net平臺的代碼。這時(shí)候就可能碰到ColorRef(也就是以int類型代表的顏色值或是以DWORD值表示的顏色)。這跟.net平臺下的顏色的相互轉(zhuǎn)換MS并沒有直接實(shí)現(xiàn)
    2013-09-09
  • C++ POSIX API超詳細(xì)分析

    C++ POSIX API超詳細(xì)分析

    這篇文章主要介紹了C++ POSIXAPI的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Arduino控制舵機(jī)詳解 附代碼

    Arduino控制舵機(jī)詳解 附代碼

    rduino是一款便捷靈活、方便上手的開源電子原型平臺,它構(gòu)建于開放原始碼simple I/O介面版,并且具有使用類似Java、C語言的Processing/Wiring開發(fā)環(huán)境,這篇文章主要介紹了Arduino控制舵機(jī)詳解(含代碼),需要的朋友可以參考下
    2023-05-05
  • C++之關(guān)于string對象的大小比較

    C++之關(guān)于string對象的大小比較

    這篇文章主要介紹了C++之關(guān)于string對象的大小比較方式,具有很好的 參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼

    C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼

    本文主要介紹了C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 基于C語言航班信息查詢與檢索

    基于C語言航班信息查詢與檢索

    這篇文章主要為大家詳細(xì)介紹了基于C語言航班信息查詢與檢索,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言分支和循環(huán)詳解

    C語言分支和循環(huán)詳解

    C語言是一門結(jié)構(gòu)化的程序設(shè)計(jì)語言,當(dāng)C語言用來描述生活中的事物時(shí),會用到三種結(jié)構(gòu):順序結(jié)構(gòu)(不去贅述),選擇結(jié)構(gòu)(對應(yīng)分支語句),循環(huán)結(jié)構(gòu)(對應(yīng)循環(huán)語句),分支語句:分支語句分為兩種,一種是if語句,一種是switch語句
    2021-10-10
  • C++ 哈夫曼樹對文件壓縮、加密實(shí)現(xiàn)代碼

    C++ 哈夫曼樹對文件壓縮、加密實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++ 哈夫曼樹對文件壓縮、加密實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

呈贡县| 南开区| 昭平县| 沙河市| 雷山县| 华宁县| 盖州市| 镶黄旗| 文昌市| 和静县| 桦南县| 兰考县| 临洮县| 克什克腾旗| 怀远县| 平江县| 拉孜县| 银川市| 普定县| 锡林浩特市| 阿荣旗| 勃利县| 宝鸡市| 宾阳县| 福安市| 肃南| 剑河县| 乌鲁木齐县| 綦江县| 敦煌市| 寻乌县| 巫溪县| 比如县| 花莲市| 建湖县| 霍城县| 宁陵县| 台东市| 乌兰察布市| 桂平市| 墨竹工卡县|