希尔排序记录--最好写的排序

启发于直接插入排序

首先看看直接插入排序的痛点

如果一个长度为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]);
}




posted @ 2020-03-11 23:09  ecnu_lxz  阅读(183)  评论(0编辑  收藏  举报