Algorithm -- Shell Sort

╰+哭是因爲堅強的太久メ 2022-06-02 11:25 249阅读 0赞

SortTestHelper.h

  1. #ifndef SELECTIONSORT_SORTTESTHELPER_H
  2. #define SELECTIONSORT_SORTTESTHELPER_H
  3. #include <iostream>
  4. #include <ctime>
  5. #include <cassert>
  6. using namespace std;
  7. namespace SortTestHelper {
  8. // 生成有n个元素的随机数组,每个元素的随机范围为[rangeL, rangeR]
  9. int *generateRandomArray(int n, int rangeL, int rangeR) {
  10. assert(rangeL <= rangeR);
  11. int *arr = new int[n];
  12. srand(time(NULL));
  13. for (int i = 0; i < n; i++)
  14. arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
  15. return arr;
  16. }
  17. int *generateNearlyOrderedArray(int n, int swapTimes) {
  18. int *arr = new int[n];
  19. for (int i = 0; i < n; ++i) {
  20. arr[i] = i;
  21. }
  22. srand(time(NULL));
  23. for (int i = 0; i < swapTimes; ++i) {
  24. int posx = rand() % n;
  25. int posy = rand() % n;
  26. swap(arr[posx], arr[posy]);
  27. }
  28. return arr;
  29. }
  30. // 打印arr数组的所有内容
  31. template<typename T>
  32. void printArray(T arr[], int n) {
  33. for (int i = 0; i < n; i++)
  34. cout << arr[i] << " ";
  35. cout << endl;
  36. return;
  37. }
  38. template<typename T>
  39. bool isSorted(T arr[], int N) {
  40. for (int i = 0; i < N - 1; ++i) {
  41. if (arr[i] > arr[i + 1]) {
  42. return false;
  43. }
  44. }
  45. return true;
  46. }
  47. template<typename T>
  48. void testSort(string sortName, void(*sort)(T[], int), T arr[], int N) {
  49. clock_t startTime = clock();
  50. sort(arr, N);
  51. clock_t endTime = clock();
  52. assert(isSorted(arr, N));
  53. cout << sortName << ":" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
  54. return;
  55. }
  56. int *copyIntArray(int a[], int n) {
  57. int *arr = new int[n];
  58. copy(a, a + n, arr);
  59. return arr;
  60. }
  61. };
  62. #endif //SELECTIONSORT_SORTTESTHELPER_H

main.cpp

  1. #include <iostream>
  2. #include "SortTestHelper.h"
  3. using namespace std;
  4. template<typename T>
  5. void shellSort(T arr[], int n) {
  6. // 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093...
  7. int h = 1;
  8. while (h < n / 3)
  9. h = 3 * h + 1;
  10. while (h >= 1) {
  11. // h-sort the array
  12. for (int i = h; i < n; i++) {
  13. // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
  14. T e = arr[i];
  15. int j;
  16. for (j = i; j >= h && e < arr[j - h]; j -= h)
  17. arr[j] = arr[j - h];
  18. arr[j] = e;
  19. }
  20. h /= 3;
  21. }
  22. }
  23. int main() {
  24. int n = 10000;
  25. /*int *arr = SortTestHelper::generateNearlyOrderedArray(n, 100);*/
  26. int *arr = SortTestHelper::generateRandomArray(n, 0, n);
  27. SortTestHelper::testSort("Shell Sort", shellSort, arr, n);
  28. delete[] arr;
  29. return 0;
  30. }

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读