zoukankan      html  css  js  c++  java
  • 数组排序希尔排序算法知识总结

    发一下牢骚和主题无关:

        希尔排序算法思惟:

         

        为了易于解理,把要排序的数成当一系列整数,让这些整数成组一个长度为n(n为这些要排序的整数的个数)的数组为例来说明。取一个小于要排序的字数的个数n的整数a,把要排序的字数分红a个小数组(这些小数组中的素元由原数组中全部离距为a和a的倍数的位置处的整数成组),然后对这些小数组停止直接插入排序。成完后之,再取一个整数a1(a1<a),然后重复面上的操纵,即停止组分和直接插入排序,直到at=1(at<at-1<···a2<a1)即全部的整数放在同一个数组中停止直接插入排序为止。简而言之,就是一种组分的直接插入排序方法。

         

         

        希尔排序的进程如下:

         

        比如对面上的整数停止希尔排序为例来说明:

        2,4,1,3

        这些整数的个数为n=4,用即是2的整数a1(a1=n/2)把这些数分割成两部分,分割的方法就是:将相隔2个数的离距的整数分配到一个数组。因此可以等到两个数组{2,1}

        和{4,3},对这两个数组停止直接插入排序后为{1,2}和{3,4},这样它们原数列中的次序就变成了:1,3,2,4

         

        然后让a2=a1/2=1,续继对前当的数列停止排序,于是就把前当的数列分红了一个新的数组(距离一个素元的离距成组的数组){1,3,2,4}然后对这个数组停止直接插入排序,于是就变成了1,2,3,4,此时a2=1,排序终了。

         

        希尔排序动画演示

         

        希尔排序核心码代如下:

         

        public void shellSort(int[] arr){
            int temp;//定义一个临时值
            boolean isChange;//断判数组中素元的排列次序是不是有化变,如果有化变,就把前当数组中的素元打印出来
            int splitLength;//定义数组中要排序的素元的距离离距
            int point;//找出前当要排序的素元的位置,即该素元在数组中位置的下标值
            splitLength=(int)arr.length/2;//定规距离长度
            while(splitLength!=0){//如果距离长度不为0
               
                /**面上的for循环的作用是
                 */
                for(int i=splitLength;i<arr.length;i++){
                    isChange=false;//置设isChange的初始值为false
                    temp=arr[i];//让
                    point=i-splitLength;
                    while(temp<arr[point]&&point>=0&&point<=arr.length){//如果第一个值比面后的值大
                        arr[point+splitLength]=arr[point];//把这个素元放在面后的位置
                        point=point-splitLength;
                        isChange=true;
                        if(point<0||point>arr.length){
                            break;
                        }
                    }
                    arr[point+splitLength]=temp;
                   
                   
                   
                    if(isChange){
                        System.out.print("排序中:");
                        for(int j=0;j<arr.length;j++){
                            System.out.printf("%3s", arr[j]);
                        }
                        System.out.println("");
                    }
                   
                   
                   
                   
                }
                splitLength=splitLength/2;
            }
            System.out.println("希尔排序成完!");
           
        }

        每日一道理
    在每个人心中,都曾停留过那些值得怀念的人,也许还在,也许早已消逝,在茫茫人海中丢失,于是,那份怀念便得凄凉,因为模糊的记忆中只剩下一个“空壳”,没有什么,甚至连自己的心都装不下,时间把一切抹平,也把当日的泪水封锁,因为已经没有,怀念只是悲凉!

         

         

        举例说明如下:

         

        package AlgorithmTest;

        /**
     *
     * @author Administrator
     */
    public class ShellSortTest {
       
        public static void main(String args[]){
            int[] a={2,4,1,3};
            ShellSortTest sst=new ShellSortTest();
            sst.shellSort(a);
        }
       
       
        public void shellSort(int[] arr){
            int temp;//定义一个临时值
            boolean isChange;//断判数组中素元的排列次序是不是有化变,如果有化变,就把前当数组中的素元打印出来
            int splitLength;//定义数组中要排序的素元的距离离距
            int point;//找出前当要排序的素元的位置,即该素元在数组中位置的下标值
            splitLength=(int)arr.length/2;//定规距离长度
            while(splitLength!=0){//如果距离长度不为0
               
                /**面上的for循环的作用是
                 */
                for(int i=splitLength;i<arr.length;i++){
                    isChange=false;//置设isChange的初始值为false
                    temp=arr[i];//让
                    point=i-splitLength;
                    while(temp<arr[point]&&point>=0&&point<=arr.length){//如果第一个值比面后的值大
                        arr[point+splitLength]=arr[point];//把这个素元放在面后的位置
                        point=point-splitLength;
                        isChange=true;
                        if(point<0||point>arr.length){
                            break;
                        }
                    }
                    arr[point+splitLength]=temp;
                   
                   
                   
                    if(isChange){
                        System.out.print("排序中:");
                        for(int j=0;j<arr.length;j++){
                            System.out.printf("%3s", arr[j]);
                        }
                        System.out.println("");
                    }
                   
                   
                   
                   
                }
                splitLength=splitLength/2;
            }
            System.out.println("希尔排序成完!");
            showArray(arr);
            System.out.println();
           
        }
       
        public void showArray(int[] arr){
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+"  ");
            }
        }
       
    }

         

         

    文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
    "万能的上帝呀,请你告诉我,我的未来会怎样?"
    上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
    于是他去问Lippman。
    Lippman说"程序员的未来就是驾驭程序员"
    这个程序员对这个未来不满意,于是他又去问上帝。
    "万能的上帝呀,请你告诉我,我的未来会怎样?"
    上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
    于是他去问Gates。
    Gates说"程序员的未来就是榨取程序员"
    这个程序员对这个未来不满意,于是他又去问上帝。
    "万能的上帝呀,请你告诉我,我的未来会怎样?"
    上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
    于是他去问侯捷。
    侯捷说"程序员的未来就是诱惑程序员"
    这个程序员对这个未来不满意,于是他又去问上帝。
    "万能的上帝呀,请你告诉我,我的未来会怎样?"
    上帝摇摇头"唉,我的孩子,你还是别当程序员了")

  • 相关阅读:
    web字体
    解决input之间的空隙
    CSS基础:text-overflow:ellipsis溢出文本
    css3控制内容的可选择性
    设置dt height 保证dd在同一行
    extjs Ext.Ajax.request 同步和异步
    jquery 同步和异步请求
    freemarker 基础
    freemarker简单使用示例
    【数据结构】线性表顺序结构的操作---C/C++语言
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3060119.html
Copyright © 2011-2022 走看看