zoukankan      html  css  js  c++  java
  • Shell Sort

    思想

    希尔排序(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("
    ");
    
    	return 0;
    }
    
    
    

    复杂度

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

  • 相关阅读:
    Flsak中的socket是基于werkzeug实现的。
    Flask中的CBV
    beego——静态文件
    beego——模板函数
    beego——模板处理
    beego——模板语法
    beego——模型定义
    beego——事务处理和命令模式
    beego——构造查询
    beego——原生SQL查询
  • 原文地址:https://www.cnblogs.com/EIMadrigal/p/12130405.html
Copyright © 2011-2022 走看看