还是老样子,先上分析图,然后上结果图,代码。
package jzoffer;
public class shellSortSmallToBig {
public static void main(String[] args) {
int [] R = {10,9,8,7,6,5,4,3,2,1};
System.out.println("原始数组如下:");
printList(R);
shellSortSmallToBig(R);
System.out.println("经过希尔排序后数组如下:");
printList(R);
}
private static void printList(int [] a){
for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("");
}
public static void shellSortSmallToBig(int [] R){
int k = R.length/2;
int temp = 0;
int x = 0;
while(k >=1){//最终是增量为1,所以这块就这么判断了,主要是为了执行到最后
for(int i = 0;i<k;i++){//一个for循环就是一趟排序
for(int j=i+k;j<R.length;j+=k){//这个就是序列里面不可能只有两个数,有可能比两个数多的话,那就需要这 个for循环
x = j-k;//主要为了记录一段增量的起始值 这里不可以用i 如果一个序列有三个值那么i肯定是行不通的
temp = R[j];//记录一段增量的末端值
while(x>=i && temp < R[x]){
R[x+k] = R[x];
x-=k;//这里主要起到两个作用,一个是退出循环
//另一个就是将下面temp的值赋值给初始值(x+k其实还等于x因为这里有个x-=k判断条件)
}
R[x+k] = temp;//不执行上面while循环与否 这句话都仅仅是一个赋值操作
}
}
k = k/2;
}
}
}
