2012-09-19 14:58 66人阅读 评论(0) 收藏 编辑 删除
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <time.h>
  5. void Swap(float &x, float &y)
  6. {
  7. x = x + y;
  8. y = x - y;
  9. x = x - y;
  10. }
  11. void PrintData(int *pDataArray, int iDataNum)
  12. {
  13. for (int i = 0; i < iDataNum; i++)
  14. printf("%d ", pDataArray[i]);
  15. printf("\n");
  16. fflush(stdout);
  17. }
  18. //交换data1和data2所指向的整形
  19. void DataSwap(int* data1, int* data2)
  20. {
  21. int temp = *data1;
  22. *data1 = *data2;
  23. *data2 = temp;
  24. }
  25. /********************************************************
  26. *函数名称:ShellInsert
  27. *参数说明:pDataArray 无序数组;
  28. *          d          增量大小
  29. *          iDataNum为无序数据个数
  30. *说明:    希尔按增量d的插入排序
  31. *********************************************************/
  32. void ShellInsert(int* pDataArray, int d, int iDataNum)
  33. {
  34. for (int i = d; i < iDataNum; i += 1)    //从第2个数据开始插入
  35. {
  36. int j = i - d;
  37. int temp = pDataArray[i];    //记录要插入的数据
  38. while (j >= 0 && pDataArray[j] > temp)    //从后向前,找到比其小的数的位置
  39. {
  40. pDataArray[j+d] = pDataArray[j];    //向后挪动
  41. j -= d;
  42. }
  43. if (j != i - d)    //存在比其小的数
  44. pDataArray[j+d] = temp;
  45. }
  46. }
  47. /********************************************************
  48. *函数名称:ShellSort
  49. *参数说明:pDataArray 无序数组;
  50. *          iDataNum为无序数据个数
  51. *说明:    希尔排序
  52. *********************************************************/
  53. void ShellSort(int* pDataArray, int iDataNum)
  54. {
  55. int d = iDataNum / 2;    //初始增量设为数组长度的一半
  56. while(d >= 1)
  57. {
  58. ShellInsert(pDataArray, d, iDataNum);
  59. d = d / 2;    //每次增量变为上次的二分之一
  60. }
  61. }
  62. /********************************************************
  63. *函数名称:GetNumInPos
  64. *参数说明:num 一个整形数据
  65. *          pos 表示要获得的整形的第pos位数据
  66. *说明:    找到num的从低到高的第pos位的数据
  67. *********************************************************/
  68. int GetNumInPos(int num,int pos)
  69. {
  70. int temp = 1;
  71. for (int i = 0; i < pos - 1; i++)
  72. temp *= 10;
  73. return (num / temp) % 10;
  74. }
  75. /********************************************************
  76. *函数名称:RadixSort
  77. *参数说明:pDataArray 无序数组;
  78. *          iDataNum为无序数据个数
  79. *说明:    基数排序
  80. *********************************************************/
  81. #define RADIX_10 10    //整形排序
  82. #define KEYNUM_31 10     //关键字个数,这里为整形位数
  83. void RadixSort(int* pDataArray, int iDataNum)
  84. {
  85. int *radixArrays[RADIX_10];    //分别为0~9的序列空间
  86. for (int i = 0; i < 10; i++)
  87. {
  88. radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
  89. radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
  90. }
  91. for (int pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
  92. {
  93. for (int i = 0; i < iDataNum; i++)    //分配过程
  94. {
  95. int num = GetNumInPos(pDataArray[i], pos);
  96. int index = ++radixArrays[num][0];
  97. radixArrays[num][index] = pDataArray[i];
  98. }
  99. for (int i = 0, j =0; i < RADIX_10; i++)    //收集
  100. {
  101. for (int k = 1; k <= radixArrays[i][0]; k++)
  102. pDataArray[j++] = radixArrays[i][k];
  103. radixArrays[i][0] = 0;    //复位
  104. }
  105. }
  106. }
  107. /********************************************************
  108. *函数名称:SlipDown
  109. *参数说明:pDataArray 无序数组;
  110. *          iCurNode为堆中需要调整的节点
  111. *          iDataNum为数组长度
  112. *函数返回:分割后的分割数位置
  113. *函数说明:调整iCurNode处的节点,形成大顶堆
  114. *********************************************************/
  115. void SlipDown(int *pDataArray,int iCurNode,int iDataNum)
  116. {
  117. int temp = pDataArray[iCurNode];    //记录需要调整的节点值
  118. for (int iNextNode = iCurNode*2; iNextNode <= iDataNum; iNextNode = iCurNode*2)
  119. {
  120. if (iNextNode + 1 <= iDataNum
  121. && pDataArray[iNextNode] < pDataArray[iNextNode + 1])    //寻找iCurNode子节点中的大者
  122. iNextNode++;
  123. if (pDataArray[iNextNode] > temp)    //大的值上移
  124. pDataArray[iCurNode] = pDataArray[iNextNode];
  125. else    //结束调整
  126. break;
  127. iCurNode = iNextNode;    //更新需要调整的节点
  128. }
  129. pDataArray[iCurNode] = temp;
  130. }
  131. /********************************************************
  132. *函数名称:HeapSort
  133. *参数说明:pDataArray 无序数组;
  134. *          iDataNum为无序数据个数
  135. *说明:    堆排序
  136. *********************************************************/
  137. void HeapSort(int* pDataArray, int iDataNum)
  138. {
  139. pDataArray--;    //让原先数组下标0对应1,便于堆中节点的访问
  140. for (int i = iDataNum/2; i > 0; i--)    //调整为大顶堆
  141. SlipDown(pDataArray, i, iDataNum);
  142. for (int i = iDataNum; i > 1; i--)    //根据大顶堆进行排序
  143. {
  144. DataSwap(&pDataArray[i], &pDataArray[1]);
  145. SlipDown(pDataArray, 1, i - 1);
  146. }
  147. }
  148. /********************************************************
  149. *函数名称:Split
  150. *参数说明:pDataArray 无序数组;
  151. *          iBegin为pDataArray需要快速排序的起始位置
  152. *          iEnd为pDataArray需要快速排序的结束位置
  153. *函数返回:分割后的分割数位置
  154. *说明:    以iBegin处的数值value作为分割数,
  155. 使其前半段小于value,后半段大于value
  156. *********************************************************/
  157. int Split(int *pDataArray,int iBegin,int iEnd)
  158. {
  159. int rIndex = rand() % (iEnd - iBegin + 1);    //随机获得偏移位置
  160. int pData = pDataArray[iBegin + rIndex];    //将iBegin+rIndex处的值作为划分值
  161. while (iBegin < iEnd)    //循环分割数组,使其前半段小于pData,后半段大于pData
  162. {
  163. while (iEnd > iBegin && pDataArray[iEnd] >= pData)    //从后向前寻找小于pData的数据位置
  164. iEnd--;
  165. if (iEnd != iBegin)
  166. {
  167. pDataArray[iBegin] = pDataArray[iEnd];    //将小于pData数据存放到数组前方
  168. iBegin++;
  169. while (iBegin < iEnd && pDataArray[iBegin] <= pData)
  170. iBegin++;
  171. if (iBegin != iEnd)
  172. {
  173. pDataArray[iEnd] = pDataArray[iBegin];    //将大于pData数据存放到数组后方
  174. iEnd--;
  175. }
  176. }
  177. }
  178. pDataArray[iEnd] = pData;    //此时iBegin=iEnd,此处存储分割数据pData
  179. return iEnd;
  180. }
  181. /********************************************************
  182. *函数名称:QSort
  183. *参数说明:pDataArray 无序数组;
  184. *          iBegin为pDataArray需要快速排序的起始位置
  185. *          iEnd为pDataArray需要快速排序的结束位置
  186. *说明:    快速排序递归函数
  187. *********************************************************/
  188. void QSort(int* pDataArray, int iBegin, int iEnd)
  189. {
  190. if (iBegin < iEnd)
  191. {
  192. int pos = Split(pDataArray, iBegin, iEnd);    //获得分割后的位置
  193. QSort(pDataArray, iBegin, pos - 1);           //对分割后的前半段递归快排
  194. QSort(pDataArray, pos + 1, iEnd);             //对分割后的后半段递归快排
  195. }
  196. }
  197. /********************************************************
  198. *函数名称:QuickSort
  199. *参数说明:pDataArray 无序数组;
  200. *          iDataNum为无序数据个数
  201. *说明:    快速排序
  202. *********************************************************/
  203. void QuickSort(int* pDataArray, int iDataNum)
  204. {
  205. QSort(pDataArray, 0, iDataNum - 1);
  206. }
  207. /********************************************************
  208. *函数名称:Merge
  209. *参数说明:pDataArray 无序数组;
  210. *          int *pTempArray 临时存储合并后的序列
  211. *          bIndex 需要合并的序列1的起始位置
  212. *          mIndex 需要合并的序列1的结束位置
  213. 并且作为序列2的起始位置
  214. *          eIndex 需要合并的序列2的结束位置
  215. *说明:    将数组中连续的两个子序列合并为一个有序序列
  216. *********************************************************/
  217. void Merge(int* pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)
  218. {
  219. int mLength = eIndex - bIndex;    //合并后的序列长度
  220. int i = 0;    //记录合并后序列插入数据的偏移
  221. int j = bIndex;    //记录子序列1插入数据的偏移
  222. int k = mIndex;    //记录子序列2掺入数据的偏移
  223. while (j < mIndex && k < eIndex)
  224. {
  225. if (pDataArray[j] <= pDataArray[k])
  226. {
  227. pTempArray[i++] = pDataArray[j];
  228. j++;
  229. }
  230. else
  231. {
  232. pTempArray[i++] = pDataArray[k];
  233. k++;
  234. }
  235. }
  236. if (j == mIndex)    //说明序列1已经插入完毕
  237. while (k < eIndex)
  238. pTempArray[i++] = pDataArray[k++];
  239. else                //说明序列2已经插入完毕
  240. while (j < mIndex)
  241. pTempArray[i++] = pDataArray[j++];
  242. for (i = 0; i < mLength; i++)    //将合并后序列重新放入pDataArray
  243. pDataArray[bIndex + i] = pTempArray[i];
  244. }
  245. /********************************************************
  246. *函数名称:BottomUpMergeSort
  247. *参数说明:pDataArray 无序数组;
  248. *          iDataNum为无序数据个数
  249. *说明:    自底向上的归并排序
  250. *********************************************************/
  251. void BottomUpMergeSort(int* pDataArray, int iDataNum)
  252. {
  253. int *pTempArray = (int *)malloc(sizeof(int) * iDataNum);    //临时存放合并后的序列
  254. int length = 1;    //初始有序子序列长度为1
  255. while (length < iDataNum)
  256. {
  257. int i = 0;
  258. for (; i + 2*length < iDataNum; i += 2*length)
  259. Merge(pDataArray, pTempArray, i, i + length, i + 2*length);
  260. if (i + length < iDataNum)
  261. Merge(pDataArray, pTempArray, i, i + length, iDataNum);
  262. length *= 2;    //有序子序列长度*2
  263. }
  264. free(pTempArray);
  265. }
  266. /********************************************************
  267. *函数名称:RecursionMergeSort
  268. *参数说明:pDataArray 无序数组;
  269. *          int *pTempArray 临时存放合并的序列
  270. *          iBegin为pDataArray需要归并排序的起始位置
  271. *          iEnd为pDataArray需要归并排序的结束位置
  272. *说明:    自顶向下的归并排序递归函数
  273. *********************************************************/
  274. void RecursionMergeSort(int* pDataArray, int *pTempArray, int iBegin, int iEnd)
  275. {
  276. if (iBegin < iEnd)
  277. {
  278. int middle = (iBegin + iEnd) / 2;
  279. RecursionMergeSort(pDataArray, pTempArray, iBegin, middle);    //前半段递归归并排序
  280. RecursionMergeSort(pDataArray, pTempArray, middle + 1, iEnd);  //后半段归并排序
  281. Merge(pDataArray, pTempArray, iBegin, middle + 1, iEnd + 1);   //合并前半段和后半段
  282. }
  283. }
  284. /********************************************************
  285. *函数名称:UpBottomMergeSort
  286. *参数说明:pDataArray 无序数组;
  287. *          iDataNum为无序数据个数
  288. *说明:    自顶向下的归并排序
  289. *********************************************************/
  290. void UpBottomMergeSort(int* pDataArray, int iDataNum)
  291. {
  292. int *pTempArray = (int *)malloc(sizeof(int) * iDataNum);    //临时存放合并后的序列
  293. RecursionMergeSort(pDataArray, pTempArray, 0, iDataNum - 1);
  294. free(pTempArray);
  295. }
  296. //查找数值iData在长度为iLen的pDataArray数组中的插入位置
  297. int FindInsertIndex(int *pDataArray, int iLen, int iData)
  298. {
  299. int iBegin = 0;
  300. int iEnd = iLen - 1;
  301. int index = -1;    //记录插入位置
  302. while (iBegin <= iEnd)
  303. {
  304. index = (iBegin + iEnd) / 2;
  305. if (pDataArray[index] > iData)
  306. iEnd = index - 1;
  307. else
  308. iBegin = index + 1;
  309. }
  310. if (pDataArray[index] <= iData)
  311. index++;
  312. return index;
  313. }
  314. /********************************************************
  315. *函数名称:BinaryInsertSort
  316. *参数说明:pDataArray 无序数组;
  317. *          iDataNum为无序数据个数
  318. *说明:    二分查找插入排序
  319. *********************************************************/
  320. void BinaryInsertSort(int* pDataArray, int iDataNum)
  321. {
  322. for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入
  323. {
  324. int index = FindInsertIndex(pDataArray, i, pDataArray[i]);    //二分寻找插入的位置
  325. if (i != index)    //插入位置不为i,才挪动、插入
  326. {
  327. int j = i;
  328. int temp = pDataArray[i];
  329. while (j > index)    //挪动位置
  330. {
  331. pDataArray[j] = pDataArray[j-1];
  332. j--;
  333. }
  334. pDataArray[j] = temp;    //插入
  335. }
  336. }
  337. }
  338. /********************************************************
  339. *函数名称:InsertSort
  340. *参数说明:pDataArray 无序数组;
  341. *          iDataNum为无序数据个数
  342. *说明:    插入排序(从前向后寻找)
  343. *********************************************************/
  344. void InsertSort(int* pDataArray, int iDataNum)
  345. {
  346. for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入
  347. {
  348. int j = 0;
  349. while (j < i && pDataArray[j] <= pDataArray[i])    //寻找插入的位置
  350. j++;
  351. if (j < i)    //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入
  352. {
  353. int k = i;
  354. int temp = pDataArray[i];
  355. while (k > j)    //挪动位置
  356. {
  357. pDataArray[k] = pDataArray[k-1];
  358. k--;
  359. }
  360. pDataArray[k] = temp;    //插入
  361. }
  362. }
  363. }
  364. /********************************************************
  365. *函数名称:InsertSort
  366. *参数说明:pDataArray 无序数组;
  367. *          iDataNum为无序数据个数
  368. *说明:    插入排序(从后向前寻找)
  369. *********************************************************/
  370. void InsertSort1(int* pDataArray, int iDataNum)
  371. {
  372. for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入
  373. {
  374. int j = i - 1;
  375. int temp = pDataArray[i];    //记录要插入的数据
  376. while (j >= 0 && pDataArray[j] > temp)    //从后向前,找到比其小的数的位置
  377. {
  378. pDataArray[j+1] = pDataArray[j];    //向后挪动
  379. j--;
  380. }
  381. if (j != i - 1)    //存在比其小的数
  382. pDataArray[j+1] = temp;
  383. }
  384. }
  385. /********************************************************
  386. *函数名称:SelectionSort
  387. *参数说明:pDataArray 无序数组;
  388. *          iDataNum为无序数据个数
  389. *说明:    选择排序
  390. *********************************************************/
  391. void SelectionSort(int* pDataArray, int iDataNum)
  392. {
  393. for (int i = 0; i < iDataNum - 1; i++)    //从第一个位置开始
  394. {
  395. int index = i;
  396. for (int j = i + 1; j < iDataNum; j++)    //寻找最小的数据索引
  397. if (pDataArray[j] < pDataArray[index])
  398. index = j;
  399. if (index != i)    //如果最小数位置变化则交换
  400. DataSwap(&pDataArray[index], &pDataArray[i]);
  401. }
  402. }
  403. /********************************************************
  404. *函数名称:BubbleSort
  405. *参数说明:pDataArray 无序数组;
  406. *          iDataNum为无序数据个数
  407. *说明:    冒泡排序
  408. *********************************************************/
  409. void BubbleSort(int* pDataArray, int iDataNum)
  410. {
  411. BOOL flag = FALSE;    //记录是否存在交换
  412. for (int i = 0; i < iDataNum - 1; i++)    //走iDataNum-1趟
  413. {
  414. flag = FALSE;
  415. for (int j = 0; j < iDataNum - i - 1; j++)
  416. if (pDataArray[j] > pDataArray[j + 1])
  417. {
  418. flag = TRUE;
  419. DataSwap(&pDataArray[j], &pDataArray[j + 1]);
  420. }
  421. if (!flag)    //上一趟比较中不存在交换,则退出排序
  422. break;
  423. }
  424. }
  425. //测试序列是否有序
  426. BOOL CheckOrder(int *pDataArray, int iDataNum)
  427. {
  428. for (int i = 0; i < iDataNum -  1; i++)
  429. if (pDataArray[i] > pDataArray[i+1])
  430. return FALSE;
  431. return TRUE;
  432. }
  433. UINT64 time_fre;    //时钟频率
  434. UINT64 GetTimeM()
  435. {
  436. //获取当前时间
  437. LARGE_INTEGER curCounter;
  438. QueryPerformanceCounter(&curCounter);
  439. return curCounter.QuadPart*1000/time_fre;
  440. }
  441. void BubbleSortTest(int *pDataArray,int length, FILE *fp)
  442. {
  443. //初始化数组
  444. for (int i = 0; i < length; i++)
  445. pDataArray[i] = rand()%100000;
  446. UINT64 begin;
  447. UINT64 end;
  448. begin = GetTimeM();
  449. BubbleSort(pDataArray, length);
  450. end = GetTimeM();
  451. fprintf(fp, " %d", int(end-begin));
  452. if (!CheckOrder(pDataArray, length))
  453. printf("BubbleSort algorithm failed!\n");
  454. else
  455. printf("BubbleSort algorithm succeed!\n");
  456. }
  457. void SelectSortTest(int *pDataArray,int length, FILE *fp)
  458. {
  459. //初始化数组
  460. for (int i = 0; i < length; i++)
  461. pDataArray[i] = rand()%100000;
  462. UINT64 begin;
  463. UINT64 end;
  464. begin = GetTimeM();
  465. SelectionSort(pDataArray, length);
  466. end = GetTimeM();
  467. fprintf(fp, " %d", int(end-begin));
  468. if (!CheckOrder(pDataArray, length))
  469. printf("SelectSort algorithm failed!\n");
  470. else
  471. printf("SelectSort algorithm succeed!\n");
  472. }
  473. void InsertSortTest(int *pDataArray,int length, FILE *fp)
  474. {
  475. //初始化数组
  476. for (int i = 0; i < length; i++)
  477. pDataArray[i] = rand()%100000;
  478. UINT64 begin;
  479. UINT64 end;
  480. begin = GetTimeM();
  481. InsertSort(pDataArray, length);
  482. end = GetTimeM();
  483. fprintf(fp, " %d", int(end-begin));
  484. if (!CheckOrder(pDataArray, length))
  485. printf("InsertSort algorithm failed!\n");
  486. else
  487. printf("InsertSort algorithm succeed!\n");
  488. }
  489. void BottomUpMergeSortTest(int *pDataArray,int length, FILE *fp)
  490. {
  491. //初始化数组
  492. for (int i = 0; i < length; i++)
  493. pDataArray[i] = rand()%100000;
  494. UINT64 begin;
  495. UINT64 end;
  496. begin = GetTimeM();
  497. BottomUpMergeSort(pDataArray, length);
  498. end = GetTimeM();
  499. fprintf(fp, " %d", int(end-begin));
  500. if (!CheckOrder(pDataArray, length))
  501. printf("BottomUpMergeSort algorithm failed!\n");
  502. else
  503. printf("BottomUpMergeSort algorithm succeed!\n");
  504. }
  505. void UpBottomMergeSortTest(int *pDataArray,int length, FILE *fp)
  506. {
  507. //初始化数组
  508. for (int i = 0; i < length; i++)
  509. pDataArray[i] = rand()%100000;
  510. UINT64 begin;
  511. UINT64 end;
  512. begin = GetTimeM();
  513. UpBottomMergeSort(pDataArray, length);
  514. end = GetTimeM();
  515. fprintf(fp, " %d", int(end-begin));
  516. if (!CheckOrder(pDataArray, length))
  517. printf("UpBottomMergeSort algorithm failed!\n");
  518. else
  519. printf("UpBottomMergeSort algorithm succeed!\n");
  520. }
  521. void QuickSortTest(int *pDataArray,int length, FILE *fp)
  522. {
  523. //初始化数组
  524. for (int i = 0; i < length; i++)
  525. pDataArray[i] = rand()%100000;
  526. UINT64 begin;
  527. UINT64 end;
  528. begin = GetTimeM();
  529. QuickSort(pDataArray, length);
  530. end = GetTimeM();
  531. fprintf(fp, " %d", int(end-begin));
  532. if (!CheckOrder(pDataArray, length))
  533. printf("QuickSort algorithm failed!\n");
  534. else
  535. printf("QuickSort algorithm succeed!\n");
  536. }
  537. void HeapSortTest(int *pDataArray,int length, FILE *fp)
  538. {
  539. //初始化数组
  540. for (int i = 0; i < length; i++)
  541. pDataArray[i] = rand()%100000;
  542. UINT64 begin;
  543. UINT64 end;
  544. begin = GetTimeM();
  545. HeapSort(pDataArray, length);
  546. end = GetTimeM();
  547. fprintf(fp, " %d", int(end-begin));
  548. if (!CheckOrder(pDataArray, length))
  549. printf("HeapSort algorithm failed!\n");
  550. else
  551. printf("HeapSort algorithm succeed!\n");
  552. }
  553. void RadixSortTest(int *pDataArray,int length, FILE *fp)
  554. {
  555. //初始化数组
  556. for (int i = 0; i < length; i++)
  557. pDataArray[i] = rand()%100000;
  558. UINT64 begin;
  559. UINT64 end;
  560. begin = GetTimeM();
  561. RadixSort(pDataArray, length);
  562. end = GetTimeM();
  563. fprintf(fp, " %d", int(end-begin));
  564. if (!CheckOrder(pDataArray, length))
  565. printf("RadixSort algorithm failed!\n");
  566. else
  567. printf("RadixSort algorithm succeed!\n");
  568. }
  569. void ShellSortTest(int *pDataArray,int length, FILE *fp)
  570. {
  571. //初始化数组
  572. for (int i = 0; i < length; i++)
  573. pDataArray[i] = rand()%100000;
  574. UINT64 begin;
  575. UINT64 end;
  576. begin = GetTimeM();
  577. ShellSort(pDataArray, length);
  578. end = GetTimeM();
  579. fprintf(fp, " %d", int(end-begin));
  580. if (!CheckOrder(pDataArray, length))
  581. printf("ShellSort algorithm failed!\n");
  582. else
  583. printf("ShellSort algorithm succeed!\n");
  584. }
  585. int main()
  586. {
  587. #define ARRAYLENGTH 10000    //无序数组初始长度
  588. #define ADDLENGTH 10000    //无序数组增幅
  589. #define MAXLENGTH 100000   //最大无序数组长度
  590. int length;
  591. srand(time(NULL));
  592. //获取时钟频率
  593. LARGE_INTEGER litmp;
  594. QueryPerformanceFrequency(&litmp);
  595. time_fre = (UINT64 )litmp.QuadPart;
  596. int *pDataArray = new int[MAXLENGTH];
  597. FILE *fp = fopen("data.txt", "w");    //将结果存储与data.txt文件中;
  598. //每一行代表一种排序在不同数据规模下的时间(毫秒)
  599. length = ARRAYLENGTH;
  600. for (; length <= MAXLENGTH; length += ADDLENGTH)
  601. {
  602. BubbleSortTest(pDataArray, length, fp);
  603. }
  604. fprintf(fp, "\n");
  605. length = ARRAYLENGTH;
  606. for (; length <= MAXLENGTH; length += ADDLENGTH)
  607. {
  608. SelectSortTest(pDataArray, length, fp);
  609. }
  610. fprintf(fp, "\n");
  611. length = ARRAYLENGTH;
  612. for (; length <= MAXLENGTH; length += ADDLENGTH)
  613. {
  614. InsertSortTest(pDataArray, length, fp);
  615. }
  616. fprintf(fp, "\n");
  617. length = ARRAYLENGTH;
  618. for (; length <= MAXLENGTH; length += ADDLENGTH)
  619. {
  620. BottomUpMergeSortTest(pDataArray, length, fp);
  621. }
  622. fprintf(fp, "\n");
  623. length = ARRAYLENGTH;
  624. for (; length <= MAXLENGTH; length += ADDLENGTH)
  625. {
  626. UpBottomMergeSortTest(pDataArray, length, fp);
  627. }
  628. fprintf(fp, "\n");
  629. length = ARRAYLENGTH;
  630. for (; length <= MAXLENGTH; length += ADDLENGTH)
  631. {
  632. QuickSortTest(pDataArray, length, fp);
  633. }
  634. fprintf(fp, "\n");
  635. length = ARRAYLENGTH;
  636. for (; length <= MAXLENGTH; length += ADDLENGTH)
  637. {
  638. HeapSortTest(pDataArray, length, fp);
  639. }
  640. fprintf(fp, "\n");
  641. length = ARRAYLENGTH;
  642. for (; length <= MAXLENGTH; length += ADDLENGTH)
  643. {
  644. RadixSortTest(pDataArray, length, fp);
  645. }
  646. fprintf(fp, "\n");
  647. length = ARRAYLENGTH;
  648. for (; length <= MAXLENGTH; length += ADDLENGTH)
  649. {
  650. ShellSortTest(pDataArray, length, fp);
  651. }
  652. fprintf(fp, "\n");
  653. fclose(fp);
  654. free(pDataArray);
  655. return 0;
  656. }

ZT 9种排序的更多相关文章

  1. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  2. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  3. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  4. ACM 一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  5. 秒杀9种排序算法(JavaScript版)

    一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...

  6. nyoj 8 一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  7. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  8. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  9. PHP的几种排序算法的比较

    这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...

随机推荐

  1. SpringMVC源码阅读:核心分发器DispatcherServlet

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将介绍SpringMVC的核 ...

  2. 既之前的基础,先写个简单的PHP 与数据库 的数据交流

    程序分三个板块, 现在先不用 css 和 javascript     先用纯 html  php  写吧. 所以那些 嵌入式 <font  size=....  什么的看看就算了,不推荐如此使 ...

  3. win8.1弹框

    在winform或者wp8中用MessageBox.Show()弹框,但是wp8.1中已经不存在了 private async void btn_Click(object sender, Routed ...

  4. Oracle - 为子查询提供动态结果集

    曾经遇到过这样一个需求:要求为method传入String,内容如"用户ID0,用户ID1,用户ID2...",然后根据这些ID返回一个结果集作为数据表供别人查询. SELECT ...

  5. C# 中的委托和事件 --转载

    作者:张子阳 转载源:  http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托 ...

  6. 泛型通配符extends与super的区别

    <? extends T>限定参数类型的上界:参数类型必须是T或T的子类型 <? super T> 限定参数类型的下界:参数类型必须是T或T的超类型 总结为: <? ex ...

  7. VMWare安装Mac OS X

    原文作者 谷月K 2016.08.16 18:55 字数3473 随着iPhone.iPad.Mac等苹果产品越来越火爆,越来越多的初学者想要了解和尝试苹果平台,包括苹果操作系统Mac OS X.苹果 ...

  8. 高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap

    平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map ...

  9. CSS页面重构“鑫三无准则”之“无图片”准则——张鑫旭

    一.再说关于“鑫三无准则” “鑫三无准则”这个概念貌似最早是在去年的去年一篇名叫“关于Google圆角高光高宽自适应按钮及其拓展”的文章中提过.这是自己在页面重构的经验中总结出来的一套约束自己CSS的 ...

  10. Yii CGridView 关联表搜索排序实例

    在这篇文章中,我准备讲解如何在CGridView中搜索或者排序关联表中的某一行,通过给Yii Blog demo添加一个list页面. 首先,检查你的blog demo里的protected\mode ...