关于希尔排序的学习

来源:互联网 发布:win10安装mac os x 编辑:程序博客网 时间:2024/06/06 02:38

希尔排序基本思想:

时空复杂度最好为o(nlogn).

  先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
  该方法实质上是一种分组插入方法。
  给定实例的shell排序的排序过程
  假设待排序文件有10个记录,其关键字分别是:
  49,38,65,97,76,13,27,49,55,04。
  增量序列的取值依次为:
  5,3,1
5,3,1

 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序
  排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止
  初始:d=5
  49 38 65 97 76 13 27 49* 55 04
  49 13
  |-------------------|
  38 27
  |-------------------|
  65 49*
  |-------------------|
  97 55
  |-------------------|
  76 04
  |-------------------|
  一趟结果
  13 27 49* 55 04 49 38 65 97 76
  d=3
  13 27 49* 55 04 49 38 65 97 76
  13 55 38 76
  |------------|------------|------------|
  27 04 65
  |------------|------------|
  49* 49 97
  |------------|------------|
  二趟结果
  13 04 49* 38 27 49 55 65 97 76
  d=1
  13 04 49* 38 27 49 55 65 97 76
  |----|----|----|----|----|----|----|----|----|
  三趟结果
  04 13 27 38 49* 49 55 65 76 97

希尔排序

// 希尔排序.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include<iostream>

#define N 100

using namespace std;

typedef int DataType;

void shell_sort(DataType *data,int n)

{

 int i,j,gap;

 gap = n/2;

 while(gap>0)

 {

  for(i=gap+1;i<=n;i++)

  {

   if(data[i]<data[i-gap])

   {

    data[0] = data[i];

    for(j=i-gap;j>0&&data[0]<data[j];j-=gap)

     data[j+gap]=data[j];

    data[j+gap]=data[0];

   }

  }

  gap/=2;

 }

}

 

int _tmain(int argc, _TCHAR* argv[])

{

 DataType data[N];

 int cases;

 cout<<"请输入案例个数:"<<endl;

 cin>>cases;

 while(cases--)

 {

  int n;

  cout<<"请输入元素的个数:";

  cin>>n;

  cout<<"请输入这些元素:"<<endl;

  int i;

  //data[0]空出来

  for(i=1;i<=n;i++)

  {

   cin>>data[i];

  }

  cout<<"希尔排序前:"<<endl;

  for(i=1;i<=n;i++)

  {

   cout<<data[i]<<" ";

  }

  cout<<endl;

  shell_sort(data,n);

  cout<<"希尔排序后:"<<endl;

  for(i=1;i<=n;i++)

  {

   cout<<data[i]<<" ";

  }

  cout<<endl;

 }

   system("pause");

 return 0;

}

 -------------------------------------------程序测试------------------------------------------

请输入案例个数:

2

请输入元素的个数:8

请输入这些元素:

23 1 13 34 113 23 12 19

希尔排序前:

23 1 13 34 113 23 12 19

希尔排序后:

1 12 13 19 23 23 34 113

请输入元素的个数:10

请输入这些元素:

10 9 8 7 6 5 4 3 2 1

希尔排序前:

10 9 8 7 6 5 4 3 2 1

希尔排序后:

1 2 3 4 5 6 7 8 9 10

请按任意键继续. . .