前言:
这个排序算法就是高级版的冒泡排序,之所以有这么个排序是为了解决冒泡排序中出现的乌龟问题(整体有序,后端有小值影响排序效率)P.S. 与乌龟问题相对有个兔子问题:整体有序,前端有大值影响排序效率。
思路:
既然是后端有小值,那么我们一开始冒泡的间隔就不用1,用一个较大的值来比较快速的先对数组后方的元素进行判断比较,以此来减小乌龟问题。通常我们用的Gap是1.3,这个值是大量实验得出来的效率比较优秀的值。
排序的核心部分可以写的和冒泡一模一样,但是最近看书得知while的效率要比for效率高上不少,因此我选择外层用while来实现。小细节写在代码块中,排序部分代码如下:
void CombSort(int *a,int length)
{
int i;
int gap = length;
while (gap >= 1)//最后肯定要以间隔为1进行一次正宗的冒泡排序
{
gap /= 1.3;
for (i = 0 ; i < length - gap; i++)//结束条件与下方a[i + gap]呼应,以防越界
{
if (a[i] > a[i + gap])
{
swap(&a[i], &a[i + gap]);
}
}
}
}
整体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 30
//之前写过了,就不再全写一遍了
void generate_random_number(int*, int, int);
void swap(int*, int*);
/* 可以说升级版的冒泡排序 */
void CombSort(int *a,int length)
{
int i;
int gap = length;
while (gap >= 1)
{
gap /= 1.3;
for (i = 0 ; i < length - gap; i++)
{
if (a[i] > a[i + gap])
{
swap(&a[i], &a[i + gap]);
}
}
}
}
int main()
{
int arr[N + 10] = { 0 };
generate_random_number(arr, 0, 1024);
CombSort(arr,N);
printf("排序后数列:\n");
for (int i = 0; i < N; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
测试结果:
至此,梳排序完成。