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

    希尔排序原理讲述:

    在前面我们利用直接插入排序的时候,可以发现如果记录是基本有序的,那么效率的相当高。伟大的希尔也发现这个问题,但我们知道在实际中,基本有序的记录是相当少。如果没有,那我们就给他创造。

    如果让大量的记录呈现一种有序的状态呢?最简单的思路是分组。怎么分呢才能基本有序呢?显然直接分组,组采用直接插入排序,然后再合并不是不行的。例如:{3,5,22,9,4,6,22,3,34}分成{3,5,2}、{9,4,6}、{22,3,34};排序后是{3,5,22},{4,6,9},{3,22,34}合并后{3,5,22,4,6,9,3,22,34}显然不说我们所说的基本有序,基本有序是指小中大这样的一个序列。

    直接分行,希尔告诉我们用跳跃分割的策略:

    就是将相距某个增量的记录组成一个子序列。

    public class ShellSort {
    
        public static void ShellSort(int[] L) {
    
            int i, j;
    
            int increament = L.length;
    
            do {
    
                increament = increament / 3 + 1;//标尺的作用,实现跳跃选择,最后一次全部来一个排序
    
                for (i = increament + 1; i < L.length; i++) {
    
                    if (L[i] < L[i - increament]) {
    
                        L[0] = L[i];
    
                        for (j = i - increament; j > 0 && L[0] < L[j]; j -= increament)
                            L[j + increament] = L[j];
    
                        L[j + increament] = L[0];
    
                    }
    
                }
    
            } while (increament > 1);
    
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            int[] test = { 0, 2, 45, 7, 2, 12, 34, 9, 22, 21, 3, 209 };
    
            ShellSort(test);
    
            for (int i = 1; i < test.length; i++) {
                System.out.print(test[i] + " ");
            }
    
        }
    
    }
    

      

     

  • 相关阅读:
    mysql5.7安装
    win10 安装docker
    快速去水印(win10换图3D工具)
    爬虫---国家食品药品监督管理总局
    食品伙伴网爬虫
    驴妈妈旅游爬虫
    天气预测(CNN)
    ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
    C#线程篇---线程池如何管理线程(6完结篇)
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
  • 原文地址:https://www.cnblogs.com/qgzhan/p/3232696.html
Copyright © 2011-2022 走看看