希尔排序记录--最好写的排序
启发于直接插入排序
首先看看直接插入排序的痛点
如果一个长度为n的数组,最后即第n个数据是整个数组中最小的,那么对最后一个数据进行插入排序的时候,比较次数为n-1,元素移动次数为n-1。
希尔排序的思想,是在较大跨度上先进行插入排序,能解决上面的痛点,使得这样的数据经过较少次数的比较,直接蹦到最前面
分组过程,使得这样的元素可以以组为单位来进行插排的跳跃,大大减少了比较的次数和移动元素的次数。
N 元素个数
第一个for循环控制的是间隔
剩下的两个for循环用于直接插入排序
for (gap = N / 2; gap > 0; gap /= 2)
for (i = gap; i < N; i++)
for (j = i - gap; j >= 0 && A[j] > A[j + gap]; j -= gap)
{
temp=A[j];
A[j]=A[j+gap];
A[j+gap]=temp;
}
完整程序
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 10
typedef int ElementType;
void shellsort( ElementType A[], int N );
int main ()
{
ElementType A[MAXN];
int N, i;
scanf("%d", &N);
for ( i=0; i<N; i++ )
scanf("%d", &A[i]);
shellsort(A, N);
system("pause>nul");
return 0;
}
void shellsort( ElementType A[], int N )
{
int i, j, gap;
ElementType temp;
for (gap = N / 2; gap > 0; gap /= 2)
for (i = gap; i < N; i++)
for (j = i - gap; j >= 0 && A[j] > A[j + gap]; j -= gap)
{
temp=A[j];
A[j]=A[j+gap];
A[j+gap]=temp;
}
for ( i=0; i<N; i++ )
printf("%d\n", A[i]);
}