日期:2014-05-16 浏览次数:20797 次
梳排序改良自冒泡排序和快速排序,是不稳定排序算法。梳排序的递减率关系着算法的效率,递减率常常使用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)