欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

#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; //記錄當前桶中的數據量 
  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; 
  //映射函數計算桶號 
  int index=keys[j]/10; 
  //初始化P成為桶中數據鏈表的頭指針 
  KeyNode *p=bucket_table[index]; 
  //該桶中還沒有數據 
  if(p->key==0){ 
   bucket_table[index]->next=node; 
   (bucket_table[index]->key)++; 
  }else{ 
   //鏈表結構的插入排序 
   while(p->next!=NULL&&p->next->key<=node->key) 
    p=p->next;  
   node->next=p->next; 
   p->next=node; 
   (bucket_table[index]->key)++; 
  } 
 } 
 //打印結果 
 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); 
} 

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

相關文章

  • C語言實現(xiàn)數據結構迷宮實驗

    C語言實現(xiàn)數據結構迷宮實驗

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)數據結構迷宮實驗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 詳解C++編程中類的聲明和對象成員的引用

    詳解C++編程中類的聲明和對象成員的引用

    這篇文章主要介紹了詳解C++編程中類的聲明和對象成員的引用,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C語言實現(xiàn)惡作劇關機程序

    C語言實現(xiàn)惡作劇關機程序

    大家好,本篇文章主要講的是C語言實現(xiàn)惡作劇關機程序,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++實現(xiàn)折半查找

    C++實現(xiàn)折半查找

    這篇文章主要為大家詳細介紹了C++實現(xiàn)折半查找,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 關于Dev-C++安裝及使用方式

    關于Dev-C++安裝及使用方式

    這篇文章主要介紹了關于Dev-C++安裝及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Qt實戰(zhàn)之實現(xiàn)圖片瀏覽器

    Qt實戰(zhàn)之實現(xiàn)圖片瀏覽器

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)簡易的圖片瀏覽器,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++?STL?iota?和?atoi?用法示例詳解

    C++?STL?iota?和?atoi?用法示例詳解

    atoi是一個C/C++標準庫中的函數,用于將一個以ASCII字符串表示的整數轉換為整數類型,這篇文章主要介紹了C++?STL?iota?和?atoi?用法,需要的朋友可以參考下
    2024-08-08
  • c++截取漢字和英文混合字符串代碼實例

    c++截取漢字和英文混合字符串代碼實例

    這篇文章主要介紹了c++截取漢字英文混合字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • C語言打印菱形實例詳解

    C語言打印菱形實例詳解

    這篇文章主要給大家介紹了關于C語言如何打印菱形的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C++執(zhí)行shell命令的多種實現(xiàn)方法

    C++執(zhí)行shell命令的多種實現(xiàn)方法

    在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價值,感興趣的可以了解一下
    2021-11-11

最新評論