歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【算法導論】C++實現計數排序

【算法導論】C++實現計數排序

日期:2017/3/1 10:08:34   编辑:Linux編程

計數排序的基本思想為:對每一個輸入的元素x,確定出小於x的元素的個數。有了這一信息,那麼就可以把x直接放到相應的位置上。

特點:

1 需要臨時的存儲空間,如果排序數據范圍特別大時,空間開銷很大。

2 適合於排序0 - 100以內的數據。

3 排序的時間復雜度為O(n)。

  1. #include <iostream>
  2. #include <string>
  3. const int size = 100;
  4. int * array_list;
  5. int * array_list_a;
  6. void print_list(int * ,int );
  7. void count_sort(int * ,int * ,int );
  8. int main(int argc,char * argv[])
  9. {
  10. array_list = new int [sizeof(int)*size];
  11. array_list_a = new int [sizeof(int)*size];
  12. srand(0);
  13. for(int i=0;i<size;i++)
  14. {/*隨機的填充數組元素*/
  15. int ran_num=rand()% size;
  16. array_list[i] = ran_num;
  17. }
  18. print_list(array_list,size);
  19. count_sort(array_list, array_list_a, size);
  20. print_list(array_list_a,size);
  21. delete array_list;
  22. delete array_list_a;
  23. return 0;
  24. }
  25. /*假設輸入的數據都是介於0 - k 的數*/
  26. void count_sort(int * array_list_a,int * array_list_b,int k)
  27. {
  28. int * c = new int [sizeof(int) * k];
  29. for(int i=0;i<k;i++)
  30. {/*初始化臨時數組*/
  31. c[i] = 0;
  32. }
  33. for(int i=0;i<size;i++)
  34. {/*對於輸入數組的重復的數值進行統計,在臨時數組c的相應的位置予以記錄*/
  35. c[array_list_a[i]] += 1;
  36. }
  37. for(int i=1;i<k;i++)
  38. {/*小於當前數據元素的個數*/
  39. c[i] += c[i-1];
  40. }
  41. for(int j=size-1;j>=0;j--)
  42. {
  43. array_list_b[c[array_list_a[j]] - 1] = array_list_a[j];
  44. c[array_list_a[j]] -= 1;
  45. }
  46. delete c;
  47. }
  48. void print_list(int * array_list,int length)
  49. {
  50. for(int i=0;i<length;i++)
  51. {
  52. std::cout<<array_list[i]<<"\t";
  53. }
  54. std::cout<<std::endl;
  55. }
Copyright © Linux教程網 All Rights Reserved