zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序是对直接插入排序的改进,它利用了跳跃分割的策略,将相隔某个增量的记录组成一个子序列,实现跳跃式的移动。先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序(此时的增量为1)。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的(最好情况下是O(n)),因此希尔排序在时间效率上比前两种方法有较大提高。

    顺序表数据结构:

    1 #define MAXSIZE 100
    2 struct SqList
    3 {
    4     int data[MAXSIZE];
    5     int length;
    6 };

    希尔排序代码:

     1 void shellsort(SqList *s)
     2 {
     3     int i,j;
     4     int increment = s->length;
     5     do 
     6     {
     7         //增量的选取是关键,本代码增量选取的是长度的一半(记录数较少)
     8         increment = increment/2;
     9         for (i=increment;i<s->length;i++)
    10         {
    11             if (s->data[i] < s->data[i-increment])
    12             {
    13                 int temp = s->data[i];
    14                 for (j=i-increment;j>=0&&s->data[j] > temp;j-=increment)
    15                 {
    16                     s->data[j+increment] = s->data[j];
    17                 }
    18                 s->data[j+increment] = temp;
    19             }
    20         }
    21     } while (increment > 1);  //退出循环的条件,增量小于1时退出循环
    22 }

    主函数:

     1 void main()
     2 {
     3     SqList *p = new SqList;
     4     int m;
     5     p->length = 5;
     6     for (int i=0;i<p->length;i++)
     7     {
     8         cin >> m;
     9         p->data[i] = m;
    10     }
    11     shellsort(p);
    12     for (int j=0;j<5;j++)
    13     {
    14         cout << p->data[j] << " ";
    15     }
    16     system("pause");
    17 }

    运行结果:

    复杂度分析:时间复杂度为:O(n1.5),空间复杂度为O(1)。由于希尔排序的记录是跳跃式移动,所以它并不是一种稳定的排序算法。

  • 相关阅读:
    Override 和 Overload 的含义和区别
    Java面向对象的三个特征与含义
    OOM有哪些情况,SOF有哪些情况
    Collection包结构,与Collections的区别
    ConcurrentHashMap
    HashMap 、LinkedHashMap、HashTable、TreeMap 和 Properties 的区别
    Map、Set、List、Queue、Stack的特点与用法
    程序员福利:一种养目法——周履靖《益龄单》
    String、StringBuffer、StringBuilder的区别
    喜欢的音乐
  • 原文地址:https://www.cnblogs.com/tracyhan/p/5475407.html
Copyright © 2011-2022 走看看