[关闭]
@Jayfeather 2018-06-12T10:00:28.000000Z 字数 5085 阅读 818

排序算法

数据结构与算法分析


  1. // 排序算法.cpp: 定义控制台应用程序的入口点。
  2. //忽然发现互联网对于编程学习真的是个好东西
  3. //几乎所有的知识点都有很详细的讲解
  4. //而且大多数都是别人已经扫过雷,很少有错误的
  5. //虽然没有书本权威,但是容易理解
  6. //而且还能及时的与作者交流
  7. /*这是一个包含11个算法+选择驱动程序的学习笔记*/
  8. /*懒得写注释了,凑活着看吧~*/
  9. #include "stdafx.h"
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. void swap(int *a, int *b);
  13. void sort(int A[], int num,int K);
  14. void BubbleSort(int A[], int num);
  15. void CocktailSort(int A[], int num);
  16. void SelectionSort(int A[], int num);
  17. void InsertionSort(int A[], int num);
  18. void InsertionSortDichotomy(int A[], int num);
  19. void ShellSort(int A[], int num);
  20. void MergeSort(int A[], int num);
  21. void merge(int A[], int left, int right, int *p);
  22. void mergearry(int A[], int left, int right, int mid, int *p);
  23. void HeapSort(int A[], int num);
  24. void Heapify(int A[], int i, int heapsize);
  25. int BuildHeap(int A[], int num);
  26. void QuickSort(int A[], int num);
  27. int Partion(int A[], int right,int left);
  28. void QuickSortcom(int A[], int right, int left);
  29. void CountingSort(int A[], int num);
  30. void LsdRadixSort(int A[], int n);
  31. int GetDigit(int x, int d);
  32. void CountingSortL(int A[], int num, int d);
  33. void InsertionSort(int A[], int left, int right);
  34. int MapToBucket(int x);
  35. void CountingSortB(int A[], int num);
  36. void BucketSort(int A[], int num);
  37. int main()
  38. {
  39. int num = 100,K=0;
  40. int A[100] = { 80, 9, 70, 22, 3, 63, 12, 81,
  41. 73, 41, 90, 83, 27, 71, 88, 5, 40, 18, 25
  42. , 37, 55, 60, 93, 87, 17, 89, 99, 84, 32
  43. , 96, 62, 98, 77, 30, 23, 35, 47, 24, 21
  44. , 53, 95, 7, 85, 2, 65, 1, 39, 43, 76, 46
  45. , 42, 91, 4, 26, 52, 86, 34, 54, 38, 78
  46. , 31, 11, 66, 36, 50, 75, 16, 68, 56, 33,
  47. 48, 15, 74, 69, 49, 6, 58, 10, 29, 92, 64,
  48. 59, 28, 61, 45, 19, 14, 13, 44, 72, 94,
  49. 20, 97, 51, 67, 79, 0, 82, 8, 57 };
  50. printf("Please insert the kind of sort you want:");
  51. scanf_s("%d", &K);
  52. sort(A, num,K);
  53. for (int i = 0; i < num; i++)
  54. printf("%d ", A[i]);
  55. return 0;
  56. }
  57. void swap(int *a, int *b)
  58. {
  59. if (a == b)
  60. return;
  61. int temp;
  62. temp = *a;
  63. *a = *b;
  64. *b = temp;
  65. }
  66. void sort(int A[100], int num,int K)
  67. {
  68. switch (K)
  69. {
  70. case 1:
  71. BubbleSort(A, num);
  72. break;
  73. case 2:
  74. CocktailSort(A, num);
  75. break;
  76. case 3:
  77. SelectionSort(A, num);
  78. break;
  79. case 4:
  80. InsertionSort(A, num);
  81. break;
  82. case 5:
  83. InsertionSortDichotomy(A, num);
  84. break;
  85. case 6:
  86. ShellSort(A, num);
  87. break;
  88. case 7:
  89. MergeSort(A, num);
  90. break;
  91. case 8:
  92. HeapSort(A, num);
  93. break;
  94. case 9:
  95. QuickSort(A, num);
  96. break;
  97. case 10:
  98. CountingSort(A, num);
  99. break;
  100. case 11:
  101. LsdRadixSort(A, num);
  102. break;
  103. case 12:
  104. BucketSort(A, num);
  105. break;
  106. }
  107. return ;
  108. }
  109. void BubbleSort(int A[], int num)
  110. {
  111. for (int i = 0; i < num;i++)
  112. {
  113. for (int t = 0; t < num - i-1; t++)
  114. {
  115. if (A[t] > A[t + 1])
  116. swap(&A[t], &A[t + 1]);
  117. }
  118. }
  119. }
  120. void CocktailSort(int A[], int num)
  121. {
  122. int i = 0;
  123. while(i<(num+1)/2)
  124. {
  125. for (int m = i; m < num - i-1; m++)
  126. {
  127. if (A[m] > A[m + 1])
  128. swap(&A[m], &A[m + 1]);
  129. }
  130. for (int n = num - i-1; n > i; n--)
  131. {
  132. if (A[n] < A[n -1])
  133. swap(&A[n], &A[n - 1]);
  134. }
  135. i++;
  136. }
  137. }
  138. void SelectionSort(int A[], int num)
  139. {
  140. for (int i = 0; i < num; i++)
  141. {
  142. int temp=i;
  143. for (int n = i; n < num; n++)
  144. {
  145. if (A[n] < A[temp])
  146. temp = n;
  147. }
  148. swap(&A[temp], &A[i]);
  149. }
  150. }
  151. void InsertionSort(int A[], int num)
  152. {
  153. for (int i = 1; i < num; i++)
  154. {
  155. int temp = A[i],n=i-1;
  156. while(n>=0)
  157. {
  158. if (temp <= A[n])
  159. A[n + 1] = A[n];
  160. else
  161. break;
  162. n--;
  163. }
  164. A[n+1] = temp;
  165. }
  166. }
  167. void InsertionSortDichotomy(int A[], int num)
  168. {
  169. for (int i = 1; i < num; i++)
  170. {
  171. int left = 0, right = i - 1, mid = (left + right) / 2;
  172. int temp = A[i];
  173. while (left <= right)
  174. {
  175. if (temp < A[mid])
  176. right = mid - 1;
  177. if (temp >= A[mid])
  178. left = mid + 1;
  179. mid = (left + right) / 2;
  180. }
  181. for (int n = i - 1; n >= left; n--)
  182. {
  183. A[n + 1] = A[n];
  184. }
  185. A[left] = temp;
  186. }
  187. }
  188. void ShellSort(int A[], int num)
  189. {
  190. int h=0;
  191. while (h < num / 3)
  192. {
  193. h = 3*h + 1;
  194. }
  195. while (h != 0)
  196. {
  197. for (int i = h; i < num; i++)
  198. {
  199. int temp = A[i], n = i-h;
  200. while (n >= 0)
  201. {
  202. if (temp <= A[n])
  203. A[n + h] = A[n];
  204. else
  205. break;
  206. n=n-h;
  207. }
  208. A[n + h] = temp;
  209. }
  210. h = (h - 1) / 3;
  211. }
  212. }
  213. void MergeSort(int A[], int num)
  214. {
  215. int *p = new int[num];
  216. merge(A, 0, num-1, p);
  217. //delete[] p;
  218. }
  219. void merge(int A[], int left, int right, int *p)
  220. {
  221. int mid = (right + left) / 2;
  222. if ((right) == left)
  223. return;
  224. else
  225. {
  226. merge(A, left, mid, p);
  227. merge(A, mid + 1, right, p);
  228. mergearry(A, left, right, mid, p);
  229. }
  230. }
  231. void mergearry(int A[], int left, int right, int mid, int *p)
  232. {
  233. int i = left, j = mid + 1, counter = 0, m = mid, n = right, *temp = p;
  234. while (j <=right && i <= mid)
  235. {
  236. if (A[i] <= A[j])
  237. {
  238. p[counter] = A[i];
  239. i++;
  240. }
  241. else if (A[i] > A[j] )
  242. {
  243. p[counter] = A[j];
  244. j++;
  245. }
  246. counter++;
  247. }
  248. while (i <= mid)
  249. {
  250. temp[counter++] = A[i++];
  251. }
  252. while (j <= right)
  253. {
  254. temp[counter++] = A[j++];
  255. }
  256. for (int n = 0; n < counter; n++)
  257. {
  258. A[left+n] = p[n];
  259. }
  260. }
  261. void HeapSort(int A[], int num)
  262. {
  263. int Heapsize = BuildHeap(A, num);
  264. while (Heapsize > 1)
  265. {
  266. swap(&A[0], &A[--Heapsize]);
  267. Heapify(A, 0, Heapsize);
  268. }
  269. }
  270. int BuildHeap(int A[], int num)
  271. {
  272. int Heapsize = num;
  273. for (int i = (num - 2) / 2; i >= 0; i--)
  274. {
  275. Heapify(A, i, Heapsize);
  276. }
  277. return Heapsize;
  278. }
  279. void Heapify(int A[], int i, int Heapsize)
  280. {
  281. int left=2*i;
  282. int right = 2 * i + 1;
  283. int max = i;
  284. if (left<Heapsize&&A[left] > A[max])
  285. {
  286. max = left;
  287. }
  288. if (right<Heapsize&&A[right] > A[max])
  289. {
  290. max = right;
  291. }
  292. if (max != i)
  293. {
  294. swap(&A[i], &A[max]);
  295. Heapify(A, max, Heapsize);
  296. }
  297. }
  298. void QuickSort(int A[], int num)
  299. {
  300. int right = num, left = 0;
  301. QuickSortcom(A, right-1, left);
  302. }
  303. void QuickSortcom(int A[], int right, int left)
  304. {
  305. if (left>=right)
  306. return;
  307. else
  308. {
  309. int mid = Partion(A, right, left);
  310. QuickSortcom(A, right, mid+1);
  311. QuickSortcom(A, mid-1, left);
  312. }
  313. }
  314. int Partion(int A[], int right, int left)
  315. {
  316. int index = A[right];
  317. int tail = left;
  318. for (int n = left; n < right; n++)
  319. {
  320. if (A[n] < index)
  321. {
  322. swap(&A[n], &A[tail]);
  323. tail++;
  324. }
  325. }
  326. swap(&A[right], &A[tail]);
  327. return tail;
  328. }
  329. void CountingSort(int A[], int num)
  330. {
  331. const int k = 100;
  332. int B[k] = { 0 };
  333. int C[100];
  334. for (int n = 0; n < num; n++)
  335. {
  336. B[A[n]]++;
  337. }
  338. for (int n = 1; n < num; n++)
  339. {
  340. B[n] += B[n - 1];
  341. }
  342. for (int n = num-1; n > 0; n--)
  343. {
  344. C[--B[A[n]]] = A[n];
  345. }
  346. for (int n = 0; n < num; n++)
  347. {
  348. A[n] = B[n];
  349. }
  350. }
  351. void LsdRadixSort(int A[], int num)
  352. {
  353. for (int d = 1; d <3;d++)
  354. {
  355. CountingSortL(A, num, d);
  356. }
  357. }
  358. int GetDigit(int x, int d)
  359. {
  360. int Digit[3] = { 1,1,10 };
  361. return (x / Digit[d]) % 10;
  362. }
  363. void CountingSortL(int A[], int num, int d)
  364. {
  365. const int k = 10;
  366. int C[k] = { 0 };
  367. int B[100];
  368. for (int n = 0; n < num; n++)
  369. {
  370. C[GetDigit(A[n], d)]++;
  371. }
  372. for (int n = 1; n < k; n++)
  373. {
  374. C[n] += C[n - 1];
  375. }
  376. for (int n = num - 1; n >= 0; n--)
  377. {
  378. B[--C[GetDigit(A[n], d)]] = A[n];
  379. }
  380. for (int n = 0; n < num; n++)
  381. {
  382. A[n] = B[n];
  383. }
  384. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注