标签:
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; //下次分组时上一次分组的一半 } } }
标签:
原文地址:http://www.cnblogs.com/lvbubu/p/4695208.html