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