zoukankan      html  css  js  c++  java
  • 希尔排序小结

    希尔排序

    希尔排序就是将给定数组分成多个部分,进行插入排序。每次分组步长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;
                        }
                    }
                }
            }
        }

     

    今天多一点积累,明天少一分烦恼
  • 相关阅读:
    VIM 基本配置
    VIM 基本配置
    CWnd与HWND的区别与转换 如何获取本窗体对象
    CWnd与HWND的区别与转换 如何获取本窗体对象
    CWnd与HWND的区别与转换 如何获取本窗体对象
    XEN
    XEN
    Xinyu Zhang
    (OK)(OK) SEEM ALL Testing Results
    如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/6547091.html
Copyright © 2011-2022 走看看