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

希尔排序

时间:2016-05-09 21:52:33      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

希尔排序是对直接插入排序的改进,它利用了跳跃分割的策略,将相隔某个增量的记录组成一个子序列,实现跳跃式的移动。先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序(此时的增量为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)。由于希尔排序的记录是跳跃式移动,所以它并不是一种稳定的排序算法。

 

希尔排序

标签:

原文地址:http://www.cnblogs.com/tracyhan/p/5475407.html

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