排序系列--希尔排序

来源:互联网 发布:吉他扒谱软件 编辑:程序博客网 时间:2024/05/17 01:40

前面说过,直接插入排序时希尔排序的一个特例。是增量为1的希尔排序。

思想:以相差同一个increment增量的记录为一个子序列,将这个子序列进行排序。汇集多个子序列,然后改变increment的值(减小),这样形成新的子序列,此时的子序列的记录比上一次的多,使更多的记录基本有序。如此不断,知道最后将整体所有的记录以increment为1,进行直接插入排序。(基本有序,保证了小数基本在前,大数基本在后,这样移动不会太频繁)

#include <iostream>
using namespace std;
#define MAXSIZE 20

void shellSort(int a[],int len)
{
 int i;
 int j;
 int tmp;
 int increment;
 increment=len;

 do{
  increment=increment/3 + 1;
  for(i=increment+1; i<=len; i++)
  {
      if(a[i] < a[i-increment])
   {
       tmp=a[i];
    for(j=i-increment; j>0&& tmp<a[j]; j=j-increment) // 关键字较小的记录,不是一个一个的移动,而是跳跃式的移动,从而使得每次完成一轮循环后,就朝着有序靠近些。
    {
        a[j+increment] = a[j];
    }
    a[j+increment] = tmp;
   }
  }
 }while(increment > 1);
 for (i=1; i<=len; i++)
 {
     cout<<a[i]<<endl;
 }
   
}

int main()
{
    int arr[MAXSIZE];
 int n;
 int i;
 
 cout<<"输入数据的个数"<<endl;
 cin>>n;
 cout<<"输入数据:"<<endl;
 for(i=1; i<=n; i++)
 {
    cin>> arr[i];
 }
  shellSort(arr, n);
  return 0;
}

 

原创粉丝点击