shell排序,又叫缩小增量法。
shell排序为什么比插入排序好?直观地来说,shell排序每一轮插入排序过后,整体将变得更加有序,更方便最后一次插入排序。
下面是代码:
void inssort(int A[], int n, int incr) //n是总长度,incr是间隔,正常的插入排序incr为1
{
int i, j;
for(i = incr; i < n; i += incr){
int temp = A[i];
for(j = i; (j >= incr) && (A[j-incr] > temp); j -= incr){
A[j] = A[j-incr];
}
A[j] = temp;
}
}
void shellsort(int A[], int n)
{
for(int i = n/2; i > 2; i/=2) // for each increment
{
for(int j = 0; j < i; j++) // Sort each sublist.
{
inssort(&A[j], n-j, i); // 注意这里传递的是A[j]的地址,所以总长度要减去j。
}
}
inssort(A, n, 1);
}