排序思想:将原数组根据增量gap=length/2 来进行分组,再对分组后的数组进行排序,以此循环,实现排序。
编程思想:(1)分组之后进行交换排序:对原数组进行增量分组后,通过交换法实现各组的排序。
(2)分组之后进行插入排序,对分组之后的数组进行排序。
时间复杂度:O(nlog n)
*希尔排序-选择法
public int [] shellSwapSort(int [] arr){
int temp = 0;
for(int gap = arr.length/2; gap > 0; gap/=2){
for(int i=gap; i<arr.length; i++){
for(int j=i-gap; j>=0; j-=gap){
if(arr[j] > arr[j+gap]){
temp = arr[j];
arr[j] = arr[j+gap];
arr[j+gap] = temp;
}
}
}
}
return arr;
}
*希尔排序-换位法(主要)
public int [] shellMoveSort(int [] arr){
for(int gap = arr.length/2; gap > 0; gap /=2){
for(int i = gap; i < arr.length; i++){
int j=i;
int temp = arr[j];
if(arr[j] < arr[j-gap]){
while(j-gap >=0 && temp < arr[j-gap]){
//移动
arr[j] = arr[j-gap];
j-= gap;
}
//退出循环时,temp找到了待插入位置
arr[j] = temp;
}
}
}
return arr;
}