A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© s526349668 中级黑马   /  2014-7-8 12:15  /  1822 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 s526349668 于 2014-7-8 20:02 编辑

这个到底具体怎么排的哦


public static void main (String[]args){
    int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};
    System.out.println("排序之前:");
    for(inti=0;i<a.length;i++){
        System.out.print(a+"");
    }
    //希尔排序
    intd=a.length;
    while(true){
        d=d/2;
        for(intx=0;x<d;x++){
            for(inti=x+d;i<a.length;i=i+d){
                inttemp=a;
                intj;
                for(j=i-d;j>=0&&a[j]>temp;j=j-d){
                    a[j+d]=a[j];
                }
                a[j+d]=temp;
            }
        }
        if(d==1){
            break;
        }
    }
    System.out.println();
    System.out.println("排序之后:");
    for(inti=0;i<a.length;i++){
        System.out.print(a+"");
    }
}

3 个回复

倒序浏览
本帖最后由 依然阿邦 于 2014-7-8 19:46 编辑

把过程打印出来不就能看懂了

public class ShellText
{
        public static void main (String[]args)
        {
            int[] arr={49,38,65,97,76,13,27,49,78,34,12,64,1};
           
            System.out.println("排序前的序列为:");
            speak(arr);
            
            //希尔排序
            int d=arr.length;
        
            while(true)
            {
                d=d/2;
                for(int x=0;x<d;x++)
                {
                    for(int i=x+d;i<arr.length;i=i+d)
                    {
                        int temp = arr;
                        int j;
                       for(j=i-d;j>=0&&arr[j]>temp;j=j-d)
                        {
                            arr[j+d]=arr[j];
                        }
                        arr[j+d]=temp;
                        
                        System.out.print("排序步骤"+" d="+d+" x="+x+"  ");
                        speak(arr);         //显示排序过程
                    }
                }
                if(d==1){
                    break;
                }
            }
           
            System.out.println("排序之后:");
            speak(arr);
        }

        public static void speak(int[] arr)           //定义一个打印数组的方法
        {
                for(int x = 0;x<arr.length;x++)
                {
                        if(x!=arr.length-1)        
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]);
                }
        }

}

运行结果
排序前的序列为:
49,38,65,97,76,13,27,49,78,34,12,64,1
排序步骤 d=6 x=0  27,38,65,97,76,13,49,49,78,34,12,64,1
排序步骤 d=6 x=0  1,38,65,97,76,13,27,49,78,34,12,64,49
排序步骤 d=6 x=1  1,38,65,97,76,13,27,49,78,34,12,64,49
排序步骤 d=6 x=2  1,38,65,97,76,13,27,49,78,34,12,64,49
排序步骤 d=6 x=3  1,38,65,34,76,13,27,49,78,97,12,64,49
排序步骤 d=6 x=4  1,38,65,34,12,13,27,49,78,97,76,64,49
排序步骤 d=6 x=5  1,38,65,34,12,13,27,49,78,97,76,64,49
排序步骤 d=3 x=0  1,38,65,34,12,13,27,49,78,97,76,64,49
排序步骤 d=3 x=0  1,38,65,27,12,13,34,49,78,97,76,64,49
排序步骤 d=3 x=0  1,38,65,27,12,13,34,49,78,97,76,64,49
排序步骤 d=3 x=0  1,38,65,27,12,13,34,49,78,49,76,64,97
排序步骤 d=3 x=1  1,12,65,27,38,13,34,49,78,49,76,64,97
排序步骤 d=3 x=1  1,12,65,27,38,13,34,49,78,49,76,64,97
排序步骤 d=3 x=1  1,12,65,27,38,13,34,49,78,49,76,64,97
排序步骤 d=3 x=2  1,12,13,27,38,65,34,49,78,49,76,64,97
排序步骤 d=3 x=2  1,12,13,27,38,65,34,49,78,49,76,64,97
排序步骤 d=3 x=2  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,38,64,34,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,64,49,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,64,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,64,65,49,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,49,64,65,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,49,64,65,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,49,64,65,76,78,97
排序步骤 d=1 x=0  1,12,13,27,34,38,49,49,64,65,76,78,97
排序之后:
1,12,13,27,34,38,49,49,64,65,76,78,97

回复 使用道具 举报
你这个程序,     int temp = arr;
这里直接把数组赋给int型,不会报错吗?
回复 使用道具 举报
排序最好理解的方法,就是当程序的for循环在执行的时候,每走一步,去在草稿纸中画出来,光看结果,回头昏的,走完一个FOR循环,就好理解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马