希尔排序

package sort;

import java.util.Scanner;

public class ShellSort {
    public static int arr[];
    static{
        System.out.println("Please enter the array to sort,and split by ',': ");
        Scanner sc=new Scanner(System.in);
        String s=sc.next();
        String n[]=s.split(",");
        arr= new int[n.length];
        System.out.print("Before sort: ");
        for(int i=0;i<arr.length;i++){
            arr[i]=Integer.parseInt(n[i]);
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
    public static void main(String args[]){
        int m=arr.length-1;
        shellSort(m);
        System.out.print("After sort: ");
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");
        System.out.println();
    }
    public static void shellSort(int m){
        int temp=0,p=0;
        int d=(m+1)/2;  //初始分组是数组长度的一半,即两个数一组
        while(d>=1){  //只要有分组就对每个分组排序
            for(int i=d;i<=m;i++){  //i从每个分组的第二个元素开始扫描
                temp=arr[i];  //记录当前待排序的数
                p=i-d;  //p是同一个分组的前一个数
                //从当前位置开始,向前找待排序数temp应该在的位置
                while(p>=0 && temp<arr[p]){  //如果当前待排序的数比同组的前一个数小
                    arr[p+d]=arr[p];  //就把同组的前一个数移到当前位置来
                    p-=d;  //p继续向前移,d其实是周期,按周期移动其实就保证了同组
                }
                arr[p+d]=temp;  //p+d是找到的位置,放入当前待排序的数temp
            }
            System.out.print("Sort results for "+d+" : ");
            for(int k=0;k<arr.length;k++)
                System.out.print(arr[k]+" ");
            System.out.println();
            d/=2;  //下次分组时上一次分组的一半
        }
    }

}

 

posted @ 2015-08-02 10:05  吕布布1995  阅读(122)  评论(0编辑  收藏  举报