zoukankan      html  css  js  c++  java
  • 数据结构-希尔排序法

      “希尔排序法”是 D.L.Shell 在 1959 年 7 月发明的一种排序法,而该排序法直接以发明者命名。其排序法的原理有点像插入排序法,但它可以减少数据搬移的次数。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。

    演算过程

    希尔法分析

    1. 任何情况下的时间复杂度均为 O(n^(3/2))
    2. 相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定排序
    3. 只需一个额外空间,所以空间复杂度是最佳的
    4. 此排序法适用于数据大部分都已排序完成的情况

    example1

    /**
     * 希尔排序法
     *
     */
    public class ShellSort {
    
        public static void main(String[] args) {
            int data[] = new int[] {6, 9, 2, 3, 4, 7, 5, 1};
            System.out.print("原始数据:");
            showData(data);
            shell(data);
            System.out.print("排序后的数据:");
            showData(data);
        }
        
        private static void shell(int data[]) {
            int length = data.length;
            int count = 2;
            int block = length/count;
            
            int i, k, tmp;
            
            while (block != 0) {
                for (i = block; i < length; i++) {
                    tmp = data[i];
                    k = i;
                    while ((k = k-block) >= 0 && tmp < data[k]) {
                        data[k+block] = data[k];
                        // data[k] = tmp;
                    }
                    data[k+block] = tmp;
                }
                block = block/count;
                showData(data);
            }
        }
        
        private static void showData(int data[]) {
            for (int i = 0; i < data.length; i++) {
                System.out.printf("[%d]", data[i]);
            }
            System.out.printf("%n");
        }
    
    }
  • 相关阅读:
    C++中的类访问控制
    Docker应用程序容器技术_转
    16C554(8250)驱动分析
    动态调频DVFS_转
    ubifs概述
    ubifs物理存储
    fmt-重新格式化段落
    uniq-删除重复
    sort
    join用法
  • 原文地址:https://www.cnblogs.com/qpliang/p/12694227.html
Copyright © 2011-2022 走看看