自己写了个希尔排序

#include<iostream>

using namespace std;

//希尔排序,步长每次减半
void ShellSort(int ndata,int data[])
{
    int i, j, k;
    int tmp;
    for (i = ndata / 2; i > 0; i = i / 2)    //步长减半
    {
        for (j = i; j < ndata; j++)
        {
            tmp = data[j];
            for (k = j; k - i >= 0; k = k - i)
            {
                if (data[k - i]>tmp)
                {
                    data[k] = data[k - i];
                }
                else
                {
                    break;
                }
            }
            data[k] = tmp;
        }
    }
}

int main()
{
    int ndata;
    int data[1000];
    cin >> ndata;
    for (int i = 0; i < ndata; i++)
    {
        cin >> data[i];
    }
    ShellSort(ndata, data);//
    cout << "排序后:" << endl;
    for (int i = 0; i < ndata; i++)
    {
        cout << data[i] << endl;
    }
    return 0;
}
时间: 2024-11-04 23:18:08

自己写了个希尔排序的相关文章

希尔排序(shell)理论---不含源码

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 希尔排序,是一个缩小增量排序.它根据步长来进行排序,步长不同可能会产生不同的序列,但是他们的最终结果是相同的,希尔排序的官方理论难以理解,这里就用非官方的解释来阐述. 原理: >1.加入有n个节点的序列,假设希尔排序的步长i,那么我们第一步就是将这n个节点,每隔i个座位为一组,如下所示(步长i要取好): [n1, n1+i] [n2, ni+2] [...........] [nx, nn] >2.然后每一组两两比较,如n1和n1+

希尔排序总结

数据结构之排序算法——希尔排序 代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想, 本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明 如果涉及到版权的问题,请联系我的邮箱,我会尽快删除 希尔排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F#C.E8.AA.9E.E8.A8.80 百度百科:http://baike.bai

插入排序算法之直接插入排序和希尔排序

插入排序算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. 直接插入排序 直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入. 例子: 有序列: 开始时,有序序列只有一个元素就是第一个元素(红色),后面的无序序列(绿色).接下来,取无序序列中

白话经典算法系列之三 希尔排序的实现

分类: 白话经典算法系列 2011-08-08 11:41 47406人阅读 评论(46) 收藏 举报 算法shell优化c 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情

算法练习--直接插入排序、希尔排序

背景: 原来虽然有学过数据结构,排序一些,但是没有好好学,现在复习一下. 正题: 1.直接插入排序 直接贴一下百科:每次取出无序数组中的一个数,把他和有序数组中的数比较,插到适当位置,直到无序表为空,有序表满. 原理很简单,就我而言,首先想到的是新建一个new_list数组,充当有序表,然后一步一步将无序表里的值拿出来放到新的数组中.但是,写完之后,看了看书上的实例, 上面直接用单数组也可以,虚拟划分数组为两部分.代码简便多.于是很我也修改了一下自己的代码. 代码如下: <?php functi

插入排序(直接插入排序和希尔排序)

一.直接插入排序 它的思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 下面我来说一下我的思路: 1.第一趟比较前两个数,然后把第二个数按大小插入到有序表中. 2.第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中. 3.依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程. 下面我用图来帮助大家理解: 实现代码: void InsertSort(int *arr, size_t size) { int end;//要排序的所有元素

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. //对于一个int数组,请编写一个选择冒泡算法,对数组元素排序. //给定一个int数组A及数组的大小n,请返回排序后的数组. //测试样例: //[1, 2, 3, 5, 2, 3], 6 //[1, 2, 2, 3, 3, 5] #include <iostream> using namesp

选择排序、插入排序和希尔排序

一些说明 我将会写一系列关于算法的博客,因为我是程序员,并不是计算机科学家,也即我是搞工程的,并不是搞学术的,所以对于我来说,最重要的就是 1.有哪些算法 2.这些算法的原理 3.这些算法的实现 4.这些算法的效率 而其他的,相对而言,并没有那么重要,比如算法的证明,所以以后的博客都会按照上述的思维撰写. 一.首先定义一个抽象类,里面集成了排序算法所需要的共同的方法: public abstract class SortBase { public abstract Integer[] sort(