码迷,mamicode.com
首页 > 编程语言 > 详细

希尔排序

时间:2020-01-01 23:58:45      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:情况下   fonts   逆序   技术   efi   while   type   alt   for   

思想

希尔排序(Shell Sort)是基于插入排序的一种不稳定排序方法。
1,将整个序列分为h个子序列;
2,第一趟将每个子序列进行插入排序;
3,第二趟将增量缩小,重复2;
4,直至增量为1,就是简单插入排序。

eg:
技术图片
技术图片

实现

#include <stdio.h>

#define MAXSIZE 100

typedef struct
{
    int a[MAXSIZE + 1];  //a[1]~a[MAXSIZE]存储元素
    int length;
}Sqlist;

/*升序排列*/
void Shell_Sort(Sqlist* L)
{
    int h = 1;
    while (h < L->length / 3)
        h = 3 * h + 1;         //增量取值
    while (h >= 1)
    {
        //从增量的那组进行插入排序
        for (int i = h; i <= L->length; i++)
        {
            int j = i;
            int get = L->a[j];
            //同组元素中与其前一个比较
            while (j - h >= 0 && L->a[j - h] > get)
            {
                L->a[j] = L->a[j - h];
                j = j - h;
            }
            L->a[j] = get;
        }
        h = h / 3;
    }
}

int main(int argc, char** argv)
{
    Sqlist L;

    scanf("%d", &(L.length));
    for (int i = 1; i <= L.length; i++)
        scanf("%d", &(L.a[i]));

    Shell_Sort(&L);

    for (int i = 1; i <= L.length; i++)
        printf("%d ", L.a[i]);
    printf("\n");

    return 0;
}

复杂度

希尔排序最优时间复杂度\(O(n)\),最差情况下也突破了平方级别的运行时间。
对于最差情况,之前的冒泡、选择要消除逆序,采用交换相邻元素的方法,也就是每次只能消除一个逆序,那么希尔每次交换隔得很远的元素,每次可以消除多个逆序,这样就节省了大量的交换时间。

希尔排序

标签:情况下   fonts   逆序   技术   efi   while   type   alt   for   

原文地址:https://www.cnblogs.com/EIMadrigal/p/12130405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!