插入排序的思想:首先假设索引为0的元素]被正确排序,然后只需要对索引为1-nums.length-1的元素排序,每次将要插入的元素赋值给变量target,然后判断target与已经排好序的元素相比较,如果target小于排好序的元素,说明target要插入到这个元素的前面,那么将此元素向后移动一位,即nums[j] = nums[j-1],将nums[j-1]赋值给nums[j],这样一直比较直到target>=nums[j-1],把target赋值给nums[j]即可,相当于把索引为i的元素插入到了索引为j处,j后面的元素都向后移动一位。代码如下:
int len = nums.length;
int i,j;
int target;
for(i=0;i<len;i++){
j=i;
target = nums[i];
while(j>0&&target<nums[j-1]){
nums[j] = nums[j-1];
j--;
}
nums[j] = target;
希尔排序:希尔排序是缩小增量排序,是插入排序的一种,首先将待排序的元素分为若干子序列,这些子序列中的元素由相隔gap(即增量)的元素组成,对子序列进行插入排序,然后再减小增量,并且随着增量的减小,序列基本有序,当增量足够小时,再对所有元素进行插入排序,当序列基本有序时,插入排序的效率高。但是这种排序算法不稳定,如果待排序的序列中存在相同元素时,如果它们被划分到不同子序列,那么相同元素可能会在各自子序列的插入排序中移动,最后稳定性会被打乱。
int len = nums.length;
int gap;
for(gap=len/2;gap>0;gap/=2){
for(int i=0;i<gap;i++){
for(int j=i+gap;j<len;j+=gap){
if(nums[j]<nums[j-gap]){
int k = j-gap;
int tmp = nums[j];
while(k>=0&&tmp<nums[k]){
nums[k+gap] = nums[k];
k-=gap;
}
nums[k+gap] = tmp;
}
}
}
}