希尔排序是基于插入排序的以下两点性质而提出改进方法的:
-
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
-
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
Shell排序的思想:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
代码如下:
#include <iostream>
#include <cassert>
using namespace std;
void shell_sort(int *arr,int n);
void shell_sort(int *arr,int n)
{
assert(arr);
int gap,i,j,temp;
gap = n /2;
for(gap; gap > 0;gap /=2)
for(j = gap; j < n; j++)
{
if(arr[j] < arr[j - gap])
{
temp = arr[j];
int k ;
for(k = j - gap ;k >=0 && arr[k ] > temp; k-=gap )
arr[k+gap] = arr[k];
arr[k+gap] = temp;
}
}
}
int main()
{
int a[5] = {4,6,2,8,1};
shell_sort(a,5);
int i = 0;
for(i = 0;i < 5; i ++)
cout << " " << a[i] << " ";
cout <<endl;
}