程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 桶排序

桶排序

編輯:C++入門知識

如我這幾天的風格一樣,概念不多說,直接正題:   >:  桶排序不是基於比較的排序,最好的時間復雜度可以達到O(n),例如:9個數 10,20,30,40,50,60,70,80,90( 這些數字的順序是任意的,任意多亂! ),給9個桶,那麼每個元素都進一個桶,且桶內無需排序(因為只有一個元素),所以進桶後,在一次出來就可以了,就是線性的!原因就是因為桶排序並不是基於比較排序的,比較排序的限制最好的其情況是 O(nlgn)。   >: 思想:很像分治( 我說的僅僅是劃為小塊的部分的思想 ,都是這種大化小),對於海量數據而言,特別是當內存一次裝不下的時候,桶排序是很有效的~  即:把[ a, b ]劃分為n個大小相同的子區間,每一子區間是一個桶。然後將n個記錄分配到各個桶中。因為關鍵字序列是均勻分布在[ n, m ]上的,所以一般不會有很多個記錄落入同一個桶中。由於同一桶中的記錄其關鍵字不盡相同,所以必須采用關鍵字比較的排序方法(通常用插入排序)對各個桶進行排 序,然後依次將各非空桶中的記錄連接(收集)起來即可。   >: 桶排序適用於什麼地方?我覺得桶排序雖然很強大,但是用錯了地方還是不行的,用錯地方其復雜度可以達到O(n^2):我覺得對於數據量超級大,但是數據的范圍確實在一個不是很大的區間內,那麼用桶排序是非常有效的!特別是當均勻分布的時候,更高效。例如:考試成績0--100分,可以分成10個桶,那麼使用桶排序統計每個分數段的處理就是很優雅的!呵呵~!   基於以上的想法,簡單實現一個桶排序的處理: CODE:( 僅僅是個演示而已~ ) // 桶排序一般比較適合:數據量非常大,但數據的范圍在一個區間內的情況 // // 此處僅僅以1-100之間的數來處理,其他的數據類型,需要做相應的修改 // 思想都是一樣的! // 桶內使用有序鏈表比較法   [cpp]   #include <stdio.h>   #include <stdlib.h>       typedef struct node   {           intvalue;           structnode * next;   }node, *p_node;       void bucket( node buc[], intelem[], int n )   {           inti = 0;           p_nodetmp, t;               for(i = 0; i < n; i++ )           {                  tmp= &buc[elem[i]/10];        // 選擇桶                  t= ( p_node )malloc( sizeof( node ) );                  t->value= elem[i];                  t->next= NULL;                      while(tmp!= NULL )                  {                          if(tmp->next == NULL )                          {                                  t->next= tmp->next;                                  tmp->next= t;                                  break;                          }                          elseif( tmp->next->value > t->value )                          {                                  t->next= tmp->next;                                  tmp->next= t;                                  break;                          }                          else                          {                                  tmp= tmp->next;                          }                  }           }   }       int main()   {           inti, n, *elem;           nodebuc[10];          // 我們准備十個桶           p_nodetmp;                     while(scanf("%d", &n) != EOF )           {                  elem= ( int * )malloc( sizeof( int ) * n );                      for(i = 0; i < n; i++ )                  {                          scanf("%d",&elem[i]);                  }                      for(i = 0; i < 10; i++ )      // 初始化桶                  {                                                     //為了方便起見,數組節點只作為頭結點,不存值                          buc[i].next= NULL;                  }                      bucket(buc, elem, n );                                   for(i = 0; i < 10; i++ )                  {                          tmp= buc[i].next;                          while( tmp )                          {   www.2cto.com                                printf("%d", tmp->value);                                  tmp= tmp->next;                          }                  }                      printf("\n");                      free(elem );           }               return0;   }          

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved