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. Socket编程 - 网络基础知识

    API编程部分:http://www.cnblogs.com/Jimmy1988/p/7895213.html 1. 协议简介 此处,我们主要介绍Linux编程常用的三种协议(TCP/UDP/IP), ...

  2. 使用JS导出页面内容到Excel

    JS代码 <script> $(function(){ // 使用outerHTML属性获取整个table元素的HTML代码(包括<table>标签),然后包装成一个完整的HT ...

  3. [转] Lodop、C-Lodop使用说明及样例

    本文转自:http://www.lodop.net/LodopDemo.html Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现 复杂打印. ...

  4. 总结 vb与数据库的连接方法

    总结 vb与数据库的连接方法 分类:vb数据库 (4672)  (38)  举报  收藏 总结:vb与数据库连接方式,两种分法. 根据是否使用ODBC(驱动程序)来分: 1.有源连接 2.无源连接. ...

  5. C# 分页方法

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...

  6. JAVA 项目 调用外部的WebSerivce接口,入门实例 (一)

    前言: 第一次接触WebService,工作需要,调用外部的WebService接口,所以暂时我这里不考虑发布,做个记录,待以后回来可以看看,只是最初级的,所以有何不好.不对的地方,欢迎看到的同僚给予 ...

  7. JDK安装与环境变量全过程-鹏鹏

    首先先讲下JDK的含义以及用处: JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Jav ...

  8. 关于在web端运行项目,eclipse报PermGen space错误

    之前在网上也查到过许多解决的方法,但可能因为本人脸黑........也修改过eclipse文件目录中的相关配置文件,并没有得到相应的帮助,因此把自己的改正方法分享下: window-->pref ...

  9. JAVA成员方法的调用分析

    如下面例子: public class A { int x=10; public int getx() {return x;} } public class B extends A { int x=2 ...

  10. C#的字节与流

    计算机中文件有很多种,我们知道实际存在计算机中的都是二进制.这里我记录了通过流对文件的读取操作. 一.首先在这里简单涉及下位,字节,字符的概念. 位(bit):可以表示0或1: 字节(byte):由8 ...