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

OJ刷题---希尔排序

时间:2015-06-04 10:00:45      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:算法   希尔排序   shell   

算法分析:

希尔排序是一种按照增量排序的方法。其中增量值是小于n的正整数。

  shell排序的基本思想[1]是:

    先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

可以根据下图形象理解:

技术分享

(1)初始增量为3,该数组分为三组分别进行排序。(初始增量值原则上可以任意设置(0<gap<n),没有限制)

(2)将增量改为2,该数组分为2组分别进行排序。

(3)将增量改为1,该数组整体进行排序。


 输入代码:

#include<iostream>
using namespace std;
void shell_sort(int a[],int n);
int main()
{
    int n,a[10000];
    cin>>n;
    for(int y=0; y<n; y++)
        cin>>a[y];
    shell_sort(a, n);
    for(int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

void shell_sort(int a[], int n)
{
    int gap;//定义增量;
    for(gap = 3; gap >0; gap--)//设置初始增量,递减;
    {
        for(int i=0; i<gap; i++)//按增量分组;
        {
            for(int j = i+gap; j<n; j=j+gap)//每组分别比较大小;
            {
                if(a[j]<a[j-gap])
                {
                    int temp = a[j];
                    int k = j-gap;
                    while(k>=0&&a[k]>temp)
                    {
                        a[k+gap] = a[k];
                        k = k-gap;
                    }
                    a[k+gap] = temp;
                }
            }
        }
    }

}



OJ刷题---希尔排序

标签:算法   希尔排序   shell   

原文地址:http://blog.csdn.net/linhaiyun_ytdx/article/details/46351693

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