[关闭]
@yudesong 2017-06-24T15:44:06.000000Z 字数 2056 阅读 590

排序

数据结构 排序 yudesong


  1. #include <iostream>
  2. using namespace std;
  3. //插入排序
  4. void InsertSort(int num[],int n)
  5. {
  6. int i,j,tmp;
  7. for(i=1;i<n;i++)
  8. {
  9. j=i;
  10. tmp = num[i]; //哨兵
  11. //找到位置之后元素后移
  12. while(j>0 && num[j-1]>tmp)
  13. {
  14. num[j] = num[j-1];
  15. j--;
  16. }
  17. num[j] = tmp;
  18. }
  19. }
  20. //希尔排序
  21. void ShellSort(int num[],int n)
  22. {
  23. int i,j,tmp;
  24. int d;
  25. for(d=n/2;d>=1;d=d/2) //以d/2为增量
  26. {
  27. for(i=d+1;i<n;i++)
  28. {
  29. tmp = num[i]; //哨兵
  30. for(j=i-d;j>0 && num[j]>tmp;j=j-d) //插入排序
  31. num[j+d] = num[j];
  32. num[j+d] = tmp;
  33. }
  34. }
  35. }
  36. //冒泡排序
  37. void BubbleSort(int num[],int n)
  38. {
  39. int i,j,tmp;
  40. for(i=0;i<n-1;i++) //比较次数
  41. for(j=n-1;j>=i;j--) //循环比较
  42. {
  43. if(num[j-1]>num[j])
  44. {
  45. tmp = num[j];
  46. num[j] = num[j-1];
  47. num[j-1] =tmp;
  48. }
  49. }
  50. }
  51. //快速排序
  52. void QuickSort(int num[],int left,int right)
  53. {
  54. int i = left;
  55. int j = right;
  56. int tmp;
  57. if(left>right)
  58. return ;
  59. while(i<j)
  60. {
  61. while(i<j && num[i]<=num[j]) j--;
  62. if(i<j)
  63. {
  64. tmp = num[i];
  65. num[i] = num[j];
  66. num[j] = tmp;
  67. i++;
  68. }
  69. while(i<j && num[i]<=num[j]) i++;
  70. if(i<j)
  71. {
  72. tmp = num[i];
  73. num[i] = num[j];
  74. num[j] = tmp;
  75. j--;
  76. }
  77. }
  78. QuickSort(num,left,i-1);
  79. QuickSort(num,i+1,right);
  80. }
  81. void HeapAdjust(int num[],int i,int n)
  82. {
  83. int left = 2*i+1;
  84. int right = 2*i+2;
  85. int target = i;
  86. int tmp;
  87. if(i<=(n/2)-1)
  88. {
  89. if(left<n && num[left]>num[target])
  90. {
  91. target = left;
  92. }
  93. if(right<n && num[right]>num[target])
  94. {
  95. target = right;
  96. }
  97. if(target!=i)
  98. {
  99. tmp = num[target];
  100. num[target] = num[i];
  101. num[i] = tmp;
  102. HeapAdjust(num,target,n);
  103. }
  104. }
  105. }
  106. //建堆
  107. void BuildHeap(int num[],int n)
  108. {
  109. int i;
  110. int tmp;
  111. //所有非叶子结点
  112. for(i=(n/2)-1;i>=0;i--)
  113. {
  114. HeapAdjust(num,i,n);
  115. }
  116. }
  117. //堆排序
  118. void HeapSort(int num[],int n)
  119. {
  120. int i;
  121. int tmp;
  122. BuildHeap(num,n);
  123. for(i=n-1;i>0;i--)
  124. {
  125. tmp = num[0];
  126. num[0] = num[i];
  127. num[i] = tmp;
  128. HeapAdjust(num,0,i-1);
  129. }
  130. }
  131. void Merge(int num[],int tmp[],int start,int mid,int end)
  132. {
  133. int i = start;
  134. int j = mid+1;
  135. int k = start;
  136. while(i!=mid+1 && j!=end+1)
  137. {
  138. if(num[i]<num[j]) tmp[k++] = num[i++];
  139. else
  140. tmp[k++] = num[j++];
  141. }
  142. while(i!=mid+1) tmp[k++] = num[i++];
  143. while(j!=end+1) tmp[k++] = num[j++];
  144. for(i=start;i<=end;i++)
  145. num[i] = tmp[i];
  146. }
  147. //归并排序
  148. void MergeSort(int num[],int tmp[],int start,int end)
  149. {
  150. int mid;
  151. if(start<end)
  152. {
  153. mid = (start+end)/2;
  154. MergeSort(num,tmp,start,mid);
  155. MergeSort(num,tmp,mid+1,end);
  156. Merge(num,tmp,start,mid,end);
  157. }
  158. }
  159. int main()
  160. {
  161. int num[9]={1,9,4,7,8,6,2,5,3};
  162. // InsertSort(num,9);
  163. // BubbleSort(num,9);
  164. // ShellSort(num,9);
  165. // QuickSort(num,0,8);
  166. // HeapSort(num,9);
  167. int tmp[9];
  168. MergeSort(num,tmp,0,8);
  169. for(int i=0;i<9;i++)
  170. cout<<num[i]<<" ";
  171. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注