歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 梳排序Linux下C 實現

梳排序Linux下C 實現

日期:2017/3/1 10:09:32   编辑:Linux編程

梳排序改良自冒泡排序和快速排序,是不穩定排序算法。梳排序的遞減率關系著算法的效率,遞減率常常使用1.3,也有人提議用1.247330950103979。下面給出關鍵代碼:

1、梳排序頭文件: combSort.h

  1. #ifndef COMBSORT_H
  2. #define COMBSORT_H
  3. #define SHRINK_FACTOR 1.3
  4. #include <stdbool.h>
  5. extern void combSort(int *pArr, const int length);
  6. #endif
2、梳排序源文件: combSort.c
  1. #include "combSort.h"
  2. void combSort(int *pArr, const int length)
  3. {
  4. bool swapped=true;
  5. int i, tmp, gap=length;
  6. while(gap > 1 || swapped)
  7. {
  8. swapped=false;
  9. if(gap>1)
  10. {
  11. gap /= SHRINK_FACTOR;
  12. }
  13. i=0;
  14. while(i+gap<length)
  15. {
  16. if(*(pArr+i)>*(pArr+i+gap))
  17. {
  18. tmp = *(pArr+i);
  19. *(pArr+i) = *(pArr+i+gap);
  20. *(pArr+i+gap) = tmp;
  21. swapped=true;
  22. }
  23. i++;
  24. }
  25. }
  26. }

3、main頭文件:main.h

  1. #ifndef MAIN_H
  2. #define MAIN_H
  3. #define MAX_VALUE 1000
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include "combSort.h"
  7. int main(void);
  8. void initRandomArr(int * pArr, const int length);
  9. void showArr(const int *pArr, const int length);
  10. #endif

4、main源文件:main.c

  1. #include "main.h"
  2. int main(void)
  3. {
  4. printf("input array length:\n");
  5. int len;
  6. scanf("%d", &len);
  7. if(len < 1)
  8. {
  9. printf("array length must be larger %d \n", len);
  10. return EXIT_FAILURE;
  11. }
  12. int arr[len];
  13. initRandomArr(arr, len);
  14. printf("get random array:\n");
  15. showArr(arr, len);
  16. combSort(arr, len);
  17. printf("comb sort result:\n");
  18. showArr(arr, len);
  19. return EXIT_SUCCESS;
  20. }
  21. void showArr(const int *pArr, const int length)
  22. {
  23. int i=0;
  24. while(i<length)
  25. {
  26. printf("%d ", *(pArr+i));
  27. i++;
  28. }
  29. printf("\n");
  30. }
  31. void initRandomArr(int *pArr, const int length)
  32. {
  33. int i;
  34. srand(time(0));
  35. for(i=0;i<length;i++)
  36. {
  37. *(pArr+i) = rand()%MAX_VALUE;
  38. }
  39. }
5、編譯:
  1. [root@localhost combSort]$ gcc -c combSort.c
  2. [root@localhost combSort]$ gcc -c main.c
  3. [root@localhost combSort]$ gcc -o main main.o combSort.o
執行可執行文件main,大致如下:
  1. [root@localhost combSort]$ ./main
  2. input array length:
  3. 10
  4. get random array:
  5. 767 740 68 436 307 343 72 314 863 790
  6. comb sort result:
  7. 68 72 307 314 343 436 740 767 790 863
梳排序時間復雜度:O(nlog n)
Copyright © Linux教程網 All Rights Reserved