希尔排序算法实现(1099)

p { margin-bottom: 0.25cm; line-height: 120% }

描述

编程实现希尔排序算法,按照非递减排序,测试数据为整数。

input

第一行是待排序数据元素的个数n; 
第二行是待排序的数据元素。

output

一趟希尔排序后的结果。

样例输入

10

50 36 41 19 23 4 20 18 12 22

样例输出

4 20 18 12 22 50 36 41 19 23

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。[1]

而这道题是进行一趟希尔排序,就是把排序的循环减少到一次,具体代码如下

#include<iostream>

#include<algorithm>

using namespace std;

#define maxsize 1000

void shellSort(int *a,int n)

{

    int i,j,gap;

    //for(gap=n/2;gap>0;gap/=2)

    for(gap=n/2;gap==n/2;gap/=2)

    {

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

        {

            for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)

            {

                swap(a[j],a[j+gap]);

            }

        }

    }

}

int main()

{

    int n;

    cin>>n;

    int a[maxsize];

    for(int i=0;i<n;i++)

    {

        cin>>a[i];

    }

    shellSort(a,n);

    for(int i=0;i<n;i++)

    {

        cout<<a[i]<<" ";

    }

    return 0;

}

时间: 2024-08-09 01:51:16

希尔排序算法实现(1099)的相关文章

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

java希尔排序算法

原文:java希尔排序算法 代码下载地址:http://www.zuidaima.com/share/1550463279090688.htm 希尔排序算法的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止.该方法实质上是一种

排序算法之 Java希尔排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Shell { public int[] sort(int[] arr){ if ( arr == null || arr.length <= 1 ){ return

排序系列 之 希尔排序算法 —— Java实现

基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序. 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高. 实例: 无序序列:int a[] = {3,1,5,7,2,4,9,6}; 第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,

【排序】希尔排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构.     希尔排序算法摘要: 希尔排序又称为“缩小增量排序”.直接插入排序算法在效率上虽说没办法突破 ,但其在少量数据或待排序列基本有序的情况下,效率却是非常高效的.因此,为进一步提高排序算法的效率,就需要适当地构造前述的那些条件.希尔排序就是第一批突破排序算法时间复杂度  的一个算法.因此,希尔排序算法算是一种属于插入排序类别的方法. 希尔排序算法思想: 算法总体描述

希尔排序算法

/* Date:2014.12.14 希尔排序思路:基于插入排序的思想. 流程:1).将有 n 个元素的数组分成 n/2 对,第1个数据和第(n/2 + 1)个数据为一对,依次配对: 2).一次循环使每一个序列对排好顺序: 3).再分为 n/4 对进行排序: 4).重复操作,随序列对数的减少最后变为1个,就完成了整个序列的排序. 时间复杂度:最差(O(ns) 1<s<2),平均O(nlogn). 空间复杂度:O(1). 是一种  不稳定  的排序算法. */ void ShellSort(in

数据结构——排序——希尔排序算法

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换.V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(nlog2n).这比最好的比较算法的O(nlogn)要差一些. 希尔排序通过将比较

希尔排序算法——缩小增量法排序

希尔排序--1959年shell提出而得名,也称为缩小增量排序算法,它是直接插入排序的改进,效率比较高,适合于中小规模的排序. 具体的算法实现步骤为:首先得知道直接插入排序的算法,然后就是选择增量给原数列进行分组,对每个分得的小组进行直接插入排序便可,然后逐渐减小这个增量,依然进行新的分组的直接插入排序,直到增量为1,此时数列便是有序数列了.具体的代码如下: 首先是对特定的增量的分组的直接插入排序: void _insert(int *A,int d,int length) //d为增量 { i

排序——希尔排序算法实现

最近在和师兄探讨希尔排序的实现原理,得到了师兄的点拨. 进入正题,讲希尔排序首先就要将插入排序,插入排序的原理很简单:给定数组a的[ first,last)区间,经过 i-1次排序之后,a[first]...a[first+i-1]已排好序.第 i  遍处理就是将 a[first+i]插入到a[first]...a[first+i-1]中合适的位置.,是的啊a[first]...a[first+i]成为一个排好序的序列.     可以利用顺序比较的方法来实现. 由于插入排序很简单,所以就不BB了