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

大數(shù)據(jù)情況下桶排序算法的運(yùn)用與C++代碼實(shí)現(xiàn)示例

 更新時(shí)間:2016年07月06日 17:35:29   作者:Heart.X.Raid  
在排序元素很多的情況下,其實(shí)桶排序的性能并不是太高,這里我們配合單鏈表的直接插入排序,來(lái)看下一大數(shù)據(jù)情況下桶排序算法的運(yùn)用與C++代碼實(shí)現(xiàn)示例:

箱排序的變種。為了區(qū)別于上述的箱排序,姑且稱(chēng)它為桶排序(實(shí)際上箱排序和桶排序是同義詞)。
桶排序的思想是把[0,1)劃分為n個(gè)大小相同的子區(qū)間,每一子區(qū)間是一個(gè)桶。然后將n個(gè)記錄分配到各個(gè)桶中。因?yàn)殛P(guān)鍵字序列是均勻分布在[0,1)上的,所以一般不會(huì)有很多個(gè)記錄落入同一個(gè)桶中。由于同一桶中的記錄其關(guān)鍵字不盡相同,所以必須采用關(guān)鍵字比較的排序方法(通常用插入排序)對(duì)各個(gè)桶進(jìn)行排序,然后依次將各非空桶中的記錄連接(收集)起來(lái)即可。
注意:
這種排序思想基于以下假設(shè):假設(shè)輸入的n個(gè)關(guān)鍵字序列是隨機(jī)分布在區(qū)間[0,1)之上。若關(guān)鍵字序列的取值范圍不是該區(qū)間,只要其取值均非負(fù),我們總能將所有關(guān)鍵字除以某一合適的數(shù),將關(guān)鍵字映射到該區(qū)間上。但要保證映射后的關(guān)鍵字是均勻分布在[0,1)上的。
桶排序的平均時(shí)間復(fù)雜度是線性的,即O(n)。
箱排序只適用于關(guān)鍵字取值范圍較小的情況,否則所需箱子的數(shù)目m太多導(dǎo)致浪費(fèi)存儲(chǔ)空間和計(jì)算時(shí)間。
例如n=10,被排序的記錄關(guān)鍵字ki取值范圍是0到99之間的整數(shù)(36,5,16,98,95,47, 32,36,48)時(shí),要用100個(gè)箱子來(lái)做一趟箱排序。(即若m=n2時(shí),箱排序的時(shí)間O(m+n)=O(n2))。

例子
一年的全國(guó)高考考生人數(shù)為500 萬(wàn),分?jǐn)?shù)使用標(biāo)準(zhǔn)分,最低100 ,最高900 ,沒(méi)有小數(shù),你把這500 萬(wàn)元素的數(shù)組排個(gè)序。
分析:對(duì)500W數(shù)據(jù)排序,如果基于比較的先進(jìn)排序,平均比較次數(shù)為O(5000000*log5000000)≈1.112億。但是我們發(fā)現(xiàn),這些數(shù)據(jù)都有特殊的條件:  100=<score<=900。那么我們就可以考慮桶排序這樣一個(gè)“投機(jī)取巧”的辦法、讓其在毫秒級(jí)別就完成500萬(wàn)排序。
方法:創(chuàng)建801(900-100)個(gè)桶。將每個(gè)考生的分?jǐn)?shù)丟進(jìn)f(score)=score-100的桶中。這個(gè)過(guò)程從頭到尾遍歷一遍數(shù)據(jù)只需要500W次。然后根據(jù)桶號(hào)大小依次將桶中數(shù)值輸出,即可以得到一個(gè)有序的序列。而且可以很容易的得到100分有***人,501分有***人。
實(shí)際上,桶排序?qū)?shù)據(jù)的條件有特殊要求,如果上面的分?jǐn)?shù)不是從100-900,而是從0-2億,那么分配2億個(gè)桶顯然是不可能的。所以桶排序有其局限性,適合元素值集合并不大的情況。
代碼:

#include<iostream.h> 
#include<malloc.h> 
 
typedef struct node{ 
 int key; 
 struct node * next; 
}KeyNode; 
 
void inc_sort(int keys[],int size,int bucket_size){ 
 KeyNode **bucket_table=(KeyNode **)malloc(bucket_size*sizeof(KeyNode *)); 
 for(int i=0;i<bucket_size;i++){ 
  bucket_table[i]=(KeyNode *)malloc(sizeof(KeyNode)); 
  bucket_table[i]->key=0; //記錄當(dāng)前桶中的數(shù)據(jù)量 
  bucket_table[i]->next=NULL; 
 } 
 for(int j=0;j<size;j++){ 
  KeyNode *node=(KeyNode *)malloc(sizeof(KeyNode)); 
  node->key=keys[j]; 
  node->next=NULL; 
  //映射函數(shù)計(jì)算桶號(hào) 
  int index=keys[j]/10; 
  //初始化P成為桶中數(shù)據(jù)鏈表的頭指針 
  KeyNode *p=bucket_table[index]; 
  //該桶中還沒(méi)有數(shù)據(jù) 
  if(p->key==0){ 
   bucket_table[index]->next=node; 
   (bucket_table[index]->key)++; 
  }else{ 
   //鏈表結(jié)構(gòu)的插入排序 
   while(p->next!=NULL&&p->next->key<=node->key) 
    p=p->next;  
   node->next=p->next; 
   p->next=node; 
   (bucket_table[index]->key)++; 
  } 
 } 
 //打印結(jié)果 
 for(int b=0;b<bucket_size;b++) 
  for(KeyNode *k=bucket_table[b]->next; k!=NULL; k=k->next) 
   cout<<k->key<<" "; 
 cout<<endl; 
} 
 
void main(){ 
 int raw[]={49,38,65,97,76,13,27,49};  
 int size=sizeof(raw)/sizeof(int);  
 inc_sort(raw,size,10); 
} 

 
上面源代碼的桶內(nèi)數(shù)據(jù)排序,我們使用了基于單鏈表的直接插入排序算法。可以使用基于雙向鏈表的快排算法提高效率。

相關(guān)文章

  • C++之vector容器的swap方法解讀

    C++之vector容器的swap方法解讀

    這篇文章主要介紹了C++之vector容器的swap方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用C語(yǔ)言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解

    使用C語(yǔ)言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解

    這篇文章主要介紹了使用C語(yǔ)言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解,fork在父進(jìn)程下創(chuàng)建出的子進(jìn)程可以與父進(jìn)程一起來(lái)多進(jìn)程運(yùn)行同一個(gè)程序,需要的朋友可以參考下
    2016-06-06
  • C語(yǔ)言調(diào)試手段:鎖定錯(cuò)誤的實(shí)現(xiàn)方法

    C語(yǔ)言調(diào)試手段:鎖定錯(cuò)誤的實(shí)現(xiàn)方法

    本篇文章是對(duì)在C語(yǔ)言調(diào)試中,鎖定錯(cuò)誤的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中rapidjson將map轉(zhuǎn)為json的方法

    C++中rapidjson將map轉(zhuǎn)為json的方法

    今天小編就為大家分享一篇關(guān)于C++中rapidjson將map轉(zhuǎn)為json的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C++中CopyFile和MoveFile函數(shù)使用區(qū)別的示例分析

    C++中CopyFile和MoveFile函數(shù)使用區(qū)別的示例分析

    這篇文章主要介紹了C++中CopyFile和MoveFile函數(shù)使用區(qū)別的示例分析,CopyFile表示將文件A拷貝到B,如果B已經(jīng)存在則覆蓋,MoveFile表示將文件A移動(dòng)到。對(duì)此感興趣的可以來(lái)了解一下
    2020-07-07
  • 詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用,詳細(xì)解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下
    2016-04-04
  • C/C++中指針和引用之相關(guān)問(wèn)題深入研究

    C/C++中指針和引用之相關(guān)問(wèn)題深入研究

    從內(nèi)存分配上看,程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因?yàn)橐寐暶鲿r(shí)必須初始化,從而指向一個(gè)已經(jīng)存在的對(duì)象。引用不能指向空值
    2013-10-10
  • C與C++中結(jié)構(gòu)體的區(qū)別

    C與C++中結(jié)構(gòu)體的區(qū)別

    C中的結(jié)構(gòu)體只涉及到數(shù)據(jù)結(jié)構(gòu),而不涉及到算法,也就是說(shuō)在C中數(shù)據(jù)結(jié)構(gòu)和算法是分離的,而到C++中一類(lèi)或者一個(gè)結(jié)構(gòu)體可以包含函數(shù)(這個(gè)函數(shù)在C++我們通常中稱(chēng)為成員函數(shù)),C++中的結(jié)構(gòu)體和類(lèi)體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)和算法的結(jié)合
    2013-10-10
  • C++解決合并兩個(gè)排序的鏈表問(wèn)題

    C++解決合并兩個(gè)排序的鏈表問(wèn)題

    本文主要介紹了通過(guò)C++解決合并兩個(gè)排序的鏈表并使新鏈表中的節(jié)點(diǎn)仍然是遞增排序的。文中代碼講解詳細(xì),有需要的朋友可以參考一下
    2021-12-12
  • C++中的long long與__int64

    C++中的long long與__int64

    這篇文章主要介紹C++中的long long與__int64,在C++ Primer當(dāng)中提到的64位的int只有l(wèi)ong long,但是在實(shí)際各種各樣的C++編譯器當(dāng)中,64位的int一直有兩種標(biāo)準(zhǔn).一種是long long,還有一種是__int64,非主流的VC甚至還支持_int64,下面文章將介紹具體內(nèi)容,需要的朋友可以參考一下
    2021-11-11

最新評(píng)論

上杭县| 垣曲县| 永嘉县| 呼伦贝尔市| 连城县| 平凉市| 萍乡市| 淳化县| 增城市| 雷山县| 安国市| 南召县| 陵水| 青州市| 海安县| 海门市| 乐陵市| 台前县| 阿克苏市| 开远市| 长汀县| 绥江县| 鸡东县| 玛沁县| 灵宝市| 定襄县| 宜城市| 丰镇市| 衡阳市| 瑞丽市| 虎林市| 延津县| 高邑县| 榆树市| 福泉市| 陕西省| 平阳县| 竹溪县| 定边县| 囊谦县| 沙湾县|