希尔排序
希尔排序又叫缩小增量排序,是通过对待排序数组分成多个部分,然后分别采用插入排序。
本例首先将数增量gap初值为length/2,这样原数组就被分成gap个数组,每个数组有两个数。
然后对每个数组进行插入排序,接着逐渐缩小增量(本例中gap=gap/2),继续排序直到增量为1结束。
希尔排序最好情况时间复杂度为O(n),最坏情况O(n²),是不稳定的。
public class Shellsort {
public static int[] sort(int[] nums){
int gap;
int j;
//增量逐渐减小
for (gap=nums.length/2;gap>0;gap=gap/2){
//从i=gap开始,即每个分数组第一个要插入的数开始
for (int i=gap;i<nums.length;i++){
//记录当前要插入的数
int temp = nums[i];
for (j=i;j>=gap&&temp<nums[j-gap];j-=gap){
//若要插入的数小于,nums[j],将分数组的往后移,插入位置往前移
nums[j] = nums[j-gap];
}
//向当前插入位置插入数
nums[j] = temp;
}
}
return nums;
}
public static void main(String[] args) {
int[] nums = {7,6,5,4,3,2,1,4,5,3,2,6,88,4,3,2,6,32,45,1,1,1,1,1,1,1,1,3,3,2,3,2,3,2};
nums = sort(nums);
for (int num : nums) {
System.out.println(num);
}
}
}