歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【算法導論】C++實現的隨機化的快速排序

【算法導論】C++實現的隨機化的快速排序

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

C++實現的隨機化的快速排序:

  1. #include <iostream>
  2. #include <set>
  3. #include <string>
  4. void swap(int * a,int * b);
  5. int partition(int * array_list,int left,int right);
  6. void Print();
  7. int random_partition(int * array_list,int left,int right);
  8. void random_quick_sort(int * array_list,int left,int right);
  9. const int size = 100;
  10. //int array_list [] ={2,8,7,1,3,5,6,4};
  11. int * array_list;
  12. int main()
  13. {
  14. //const int size = 10;
  15. array_list = new int [sizeof(int)*size];
  16. srand(0);
  17. for(int i=0;i<size;i++)
  18. {/*隨即的填充數組元素*/
  19. int ran_num=rand()% size;
  20. array_list[i] = ran_num;
  21. }
  22. random_quick_sort(array_list,0,size - 1);
  23. Print();
  24. return 0;
  25. }
  26. void random_quick_sort(int * array_list,int left,int right)
  27. {
  28. if(left >= right)
  29. {
  30. return ;
  31. }
  32. int index = random_partition(array_list,left,right);
  33. random_quick_sort(array_list,left,index - 1);
  34. random_quick_sort(array_list,index + 1,right);
  35. }
  36. /*隨機化的快速排序對於輸入的元素加入隨機化的成分,使之獲得較好的平均性能*/
  37. int random_partition(int * array_list,int left,int right)
  38. {
  39. srand(left);
  40. int ran_num=( rand())% right;
  41. if((ran_num < left ))
  42. {/*防止出現因為取模後隨機數為0的情況*/
  43. ran_num = left;
  44. }
  45. /*如果,不交換排序區間內的數據,則成為普通的快速排序*/
  46. swap(&array_list[right],&array_list[ran_num]);
  47. return partition(array_list,left,right);
  48. }
  49. int partition(int * array_list,int left,int right)
  50. {
  51. int index = left;
  52. int pivot = array_list[right];
  53. for(int i= left ; i< right; i++)
  54. {
  55. if(array_list[i] < pivot)
  56. {
  57. swap(&array_list[index],&array_list[i]);
  58. index ++;
  59. }
  60. }
  61. swap(&array_list[right],&array_list[index]);
  62. //Print();
  63. return index;
  64. }
  65. void swap(int * a,int * b)
  66. {
  67. int tmp = *a;
  68. *a = *b;
  69. *b = tmp;
  70. }
  71. void Print()
  72. {
  73. for(int i=0;i< size;i++)
  74. {
  75. std::cout<<array_list[i]<<"\t";
  76. }
  77. std::cout<<std::endl;
  78. }
Copyright © Linux教程網 All Rights Reserved