排序之希尔排序
简介
希尔排序是对插入排序的升级,要理解希尔排序需要先理解插入排序。希尔排序是选择不断减少的间隔值来进行插入排序,当间隔值到1的时候就基本有序了,这时就可以进行少量的操作完成排序了。
思路
1.选取间隔值:g
因为g的选取是比较复杂的,这里选取的是 g = g*3 +1的递推式来进行排序的,当然是按照递减的顺序排序并且最终的g应该为1,一般来说,只要不是2的幂次方的g就不会降低效率。(这句是看书上的…逃~~~)
这里是用的List进行存放的。
2.进行递减间隔值排序
这里的理解较为困难。
1.这个g就是说要从下标为g的位置开始到数组末尾。
2.在找要插入位置的时候是向前移动g个位置开始进行插入(条件是下标要大于0与插入排序的条件是不需要变的),也就是说是按照每隔g个位置是一个元素来进行排序的。
3.如此循环到g=1就结束了。
这里我说得可能太简单了,但我是如此理解的,如果不对欢迎指正。
下面是我的代码:
代码
class Solution {
public int[] sortArray(int[] nums) {
List list = new ArrayList<Integer>();
for(int h = 1;;){
if(h > nums.length){
break;
}
list.add(h);
h = h*3 + 1 ;
}
for(int i = list.size()-1;i >= 0 ;i--){
int G = (int)(list.get(i));
insertionSort(nums,G);
}
return nums;
}
public void insertionSort(int[] nums,int g){
int j,tar;
int n = nums.length;
for(int i = g;i < n;i++){
tar = nums[i];
j = i - g;
while(j >= 0 && nums[j] > tar ){
nums[j+g] = nums[j];
j = j - g;
}
nums[j+g] = tar;
}
}
}