排序系列 之 希尔排序算法 —— Java实现

 基本思想:

  希尔排序的实质就是分组插入排序,又称缩小增量法。

  将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。

  因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高。

 实例:

  无序序列:int a[] = {3,1,5,7,2,4,9,6};

  第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,2}、{1,4}、{5,9}、{7,6}

  第二趟时:gap=gap/2=2; 把整个序列共分成了2个子序列{2,5,3,9}、{1,6,4,7}

  第三趟时:对整个序列进行直接插入排序

  

  希尔排序是不稳定的

 Java实现:

package sort;
/**
 * 希尔排序 算法 的实现
 * @author 那一季的银杏叶
 *
 */
public class ShellSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ShellSort().run();
    }

    private void run() {
        // TODO Auto-generated method stub
        int a[] = {3,1,5,7,2,4,9,6};
        System.out.println("———————————————————希尔排序算法—————————————————————");
//        shellSort(a);
        shellSort2(a);
        printResult(a,a.length);
    }
    /**
     * 希尔排序(缩小增量法) 属于插入类排序
     * 不稳定
     * @param a
     */
    private void shellSort(int[] a){
        int n=a.length;
        int gap=n/2;
        while(gap>=1){
            for(int i=gap;i<a.length;i++){
                int j=0;
                int temp = a[i];
                for(j=i-gap;j>=0 && temp<a[j];j=j-gap){
                    a[j+gap] = a[j];
                }
                a[j+gap] = temp;
            }
            printResult(a,a.length);
            gap = gap/2;
        }
    }
    /**
     * 严格按照定义来写的希尔排序
     * @param a
     */
    private void shellSort2(int[] a){
        int n=a.length;
        int i,j,k,gap;
        for(gap=n/2;gap>0;gap/=2){
            for(i=0;i<gap;i++){
                for(j=i+gap;j<n;j+=gap){
                    int temp = a[j];
                    for(k=j-gap;k>=0 && a[k]>temp;k-=gap){
                        a[k+gap]=a[k];
                    }
                    a[k+gap]=temp;
                }
            }
            printResult(a,a.length);
        }
    }
    private void printResult(int[] a, int n){
        for(int j=0;j<n;j++){
            System.out.print(" "+a[j]);
        }
        System.out.println();
    }
}

 运行结果展示:

  (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

时间: 2024-10-12 19:43:18

排序系列 之 希尔排序算法 —— Java实现的相关文章

排序系列 之 直接插入排序算法 —— Java实现

直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数)    有序表:3:无序表:1,5,7,2,4,9,6 1.第一次循环,从无序表中取出第一个数 1,把它插入到有序表中,使新的数列依旧有序    有序表:1,3:无序表:5,7,2,4,9,6 2

排序系列 之 折半插入排序算法 —— Java实现

基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找. 实例: (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.htm

(转) 白话经典算法系列之三 希尔排序的实现(附源代码实现)

链接:http://blog.csdn.net/morewindows/article/details/6668714 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率

基本排序系列之计数排序

简述计数排序 看了好多别人写的计数排序,看了好久都没看懂,弄了好久最后发现这么简单居然花了几个小时,所以在这里写上,希望和我一样的初学者不会再绕弯路. 一.简述计数排序的思想: 设被排序的数组为A,排序后存储到B,C为临时数组.所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以:在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成.下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上.原理是:C[A[i]]

SDUT 3403 数据结构实验之排序六:希尔排序

数据结构实验之排序六:希尔排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率:对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法.你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法 本篇名言:"一个人光溜溜的到这个世界来 ,最后光溜溜的离开这个世界而去 , 彻底想起来 , 名利都是身外物 ,只有尽一人的心力 , 使社会上的人多得他工作的裨益 ,是人生最愉快的事情.--邹韬奋" 下面是希尔排序法了. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47706135 1.  希尔排序 希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序

算法系列【希尔排序】篇

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

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

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

图解算法系列之希尔排序

希尔排序 (1)算法描述 对于给定的线性序列,将这个序列按照一定规则进行分组,每个小序列使用插入排序的方法排序.由于是每个分组进行排序,序列总体只是局部有序,全局还是无序的.因此全部的分组进行一次排序后,再将小分组划分成更大的分组进行排序,直到只有一个分组,并且这个分组也是有序的.也就是说上面描述的分组是个增量分组.随着增量的减少,每个分组的元素逐渐变多.当增量减少至1的时候,整个线性序列就有序了. 理解增量分组 (2)图解算法 (3) C/C++代码实现 Custom.h void Shell