日期:2014-05-16 浏览次数:20801 次
梳排序改良自冒泡排序和快速排序,是不稳定排序算法。梳排序的递减率关系着算法的效率,递减率常常使用1.3,也有人提议用1.247330950103979。下面给出关键代码:
1、梳排序头文件: combSort.h
#ifndef COMBSORT_H #define COMBSORT_H #define SHRINK_FACTOR 1.3 #include <stdbool.h> extern void combSort(int *pArr, const int length); #endif
2、梳排序源文件: combSort.c
#include "combSort.h"
void combSort(int *pArr, const int length)
{
        bool swapped=true;
        int i, tmp, gap=length;
        while(gap > 1 || swapped)
        {
                swapped=false;
                if(gap>1)
                {
                        gap /= SHRINK_FACTOR; 
                }
                i=0;
                while(i+gap<length)
                {
                        if(*(pArr+i)>*(pArr+i+gap))
                        {
                                tmp = *(pArr+i);
                                *(pArr+i) = *(pArr+i+gap);
                                *(pArr+i+gap) = tmp;
                                swapped=true;
                        }
                        i++;
                }
        }
}
             3、main头文件:main.h
#ifndef MAIN_H #define MAIN_H #define MAX_VALUE 1000 #include <stdlib.h> #include <stdio.h> #include "combSort.h" int main(void); void initRandomArr(int * pArr, const int length); void showArr(const int *pArr, const int length); #endif
             4、main源文件:main.c
#include "main.h"
int main(void)
{
        printf("input array length:\n");
        int len;
        scanf("%d", &len);
        if(len < 1)
        {
                printf("array length must be larger %d \n", len);
                return EXIT_FAILURE;
        }
        int arr[len];
        initRandomArr(arr, len);
        printf("get random array:\n");
        showArr(arr, len);
        combSort(arr, len);
        printf("comb sort result:\n");
        showArr(arr, len);
        return EXIT_SUCCESS;
}
void showArr(const int *pArr, const int length)
{
        int i=0;
        while(i<length)
        {
                printf("%d ", *(pArr+i));
                i++;
        }
        printf("\n");
}
void initRandomArr(int *pArr, const int length)
{
        int i;
        srand(time(0));
        for(i=0;i<length;i++)
        {
                *(pArr+i) = rand()%MAX_VALUE;
        }
}
            5、编译:
[root@localhost combSort]$ gcc -c combSort.c [root@localhost combSort]$ gcc -c main.c [root@localhost combSort]$ gcc -o main main.o combSort.o
           执行可执行文件main,大致如下:
[root@localhost combSort]$ ./main input array length: 10 get random array: 767 740 68 436 307 343 72 314 863 790 comb sort result: 68 72 307 314 343 436 740 767 790 863
            梳排序时间复杂度:O(nlog n)