希尔排序小结

希尔排序

希尔排序就是将给定数组分成多个部分,进行插入排序。每次分组步长gap为n/2,即是每隔gap的数都是一组的。简单的说如果一个数组长度为10{0,1,2,3,4,5,6,7,8,9},gap为2时,那么0,2,4,6,8,为一组,1,3,5,7,9为一组。然后分别对这两组进行插入排序。gap一般定为n/2,以此循环下去,n/2/2,每次步长为上一次的一半,直到gap==1时,那么在n==1完成后,最终排序也就完成了。

希尔排序图

如上图数组颜色一样的为一组,然后对这一组,进行插入排序。初始数据为  5,4,6,8,7,3,0,1 第一步gap==8/2。

分组情况为{5,7} {4,3} { 6,0} { 8,1}分别对这四组插入排序 { 5,7} {3,4} {0,6} {1,8} 

最后数据为{5,3,0,1,7,4,6,8}

gap==2时分组情况为{5,0,7,6} {3,1,4,8} 分别插入排序结果是{0,5,6,7} {1,3,4,8}最后数据结果是{0,1,5,3,6,4,7,8}

如此循环直到n==1完成排序。

代码实现:

  void shellsort1(int a[], int n)
    {
        int i, j, gap;

        /**
         * 步长,划分组的
         */
        for (gap = n / 2; gap > 0; gap /= 2)
        {
            /**
             * 划分成组
             */
            for (i = 0; i < gap; i++)
            {
                /**
                 * 每组直接插入算法
                 */
                for (j = i + gap; j < n; 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 -= gap;
                        }
                        a[k + gap] = temp;
                    }
                }
            }
        }
    }

 

时间: 2024-08-02 14:52:20

希尔排序小结的相关文章

排序小结

也学习了一段时间的ACM , 是该对所有的排序做个小结. 排序的分类: 1 . 冒泡排序 ( 类似于吐泡泡的方式,每次比较相邻的元素,视情况决定是否交换 ). 2 . 选择排序 ( 此方法是从一组数据中选择出最大的或者最小的数  ) . 3 . 插入排序 4 . 希尔排序 5 . 归并排序 6 . 桶排序 算法的时间复杂度 :

数据结构开发(17):冒泡排序和希尔排序

0.目录 1.冒泡排序 2.希尔排序 3.小结 1.冒泡排序 冒泡排序的基本思想: 第 i 次冒泡排序示例: 实现冒泡排序(在Sort.h中): public: template <typename T> static void Bubble(T array[], int len, bool min2max = true) { bool exchange = true; for(int i=0; (i<len) && exchange; i++) { exchange =

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法学习#09--用简单的思维理解选择、插入、冒泡和希尔排序

选择排序 1.原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 2.特点 ①运行时间与输入无关. 无论输入初始状态如何,是否有序,都需要遍历数组来找出最小的元素.其他算法则更善于利用输入的初始状态来优化时间. ②数据移动次数最小. 如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进

奔走在算法的大路上(一)排序之希尔排序

希尔排序是插入排序的一种更高效的改进版本.它的作法不是每次一个元素挨一个元素的比较.而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置:然后增量缩小:最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率.希尔排序对增量序列的选择没有严格规定. 希尔排序最关键的是选对增量,关于增量的选择,建议参考:http://zh.wikipedia.org/wiki/希尔排序  中的步长序列. 希尔排序的核心思想是:由一定规则将带排序的长序列切割成多个子序列,子序列进行内部插入排序,如

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

算法系列【希尔排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入.直接选择和冒泡排序. 2.     线性对数阶 (O(nlog2n)) 排序快速排序.堆排序和归并排序: 3.     O(n1+§))排序,§ 是介于 0 和 1 之间的常数.希尔排序 4.     线性阶 (O(n)) 排序基数排序,此外还有桶.箱排序. 关于稳定性: 稳定的排序算法:冒泡排序

希尔排序算法实现(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)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一