1.1希尔排序(插入排序的改良)

0.算法解决的问题

为了减少插入排序(朴素的排序算法)所耗时间,我们采取一种基于其原理的,但是不同思想的算法.

1.输入与输出

  • 输入:乱序的数组
  • 输出:排好序的该数组

2.算法思想

把数组中间隔为h的元素取出来看作一个单独的数组进行排序。假设h=3,
那么可以把数组分为

a[0],a[3],a[6]……

a[1],a[4],a[7]……

a[2],a[5],a[8]……
所谓的h有序数组

如上图所示,先将拆分过后的小数组进行排序,缩小h后再次排序。直到h=1,排序完成。

3.伪代码及注释

三个循环分别代表:h值不断缩小,一个h值中排序的组不断变化,插入排序。

4.java代码实现

public static int[] shellSort(int[] a)
    {
    int temp=0;
    int n = a.length;
    int h,j;
     for (h = n / 2; h > 0; h /= 2)  
    for (j = h; j < n; j++)//从数组第h个元素开始  
        if (a[j] < a[j - h])//每个元素与自己组内的数据进行直接插入排序  
        {  
            temp = a[j];  
            int k = j - h;  
            while (k >= 0 && a[k] > temp)  
            {  
                a[k + h] = a[k];  
                k -= h;  
            }  
            a[k + h] = temp;  
        }                  
    return a;
}

5.复杂度

对于近似有序的数组来说,插入算法的速度是很快的。
相比于传统的插入算法,希尔算法每次将元素移动的距离增大了h,这解决了移动距离远的情况下移动距离次数多这一问题。

6.优缺点及适用范围

适用于大型的,静态的数据库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,460评论 1 4
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,285评论 0 2
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,300评论 0 35
  • 9.3.3 快速排序   快速排序将原数组划分为两个子数组,第一个子数组中元素小于等于某个边界值,第二个子数组中的...
    RichardJieChen阅读 1,870评论 0 3
  • 最近做项目,遇到需要修改状态栏style的地方,在这里记录一下 方法一: [[UIApplication shar...
    QuintGao阅读 658评论 0 1