插入排序:
实现步骤:
1 记录第二个数的值和下标
2 循环与前一个值比较
若小于则 将前一个值付给本位置,本位置下标减一
若大于 则值与下标都不变
/**
* 插入排序
* 从第二个开始判断 大于前一个位置不变
* 小于前一个 将前一个提前,直到找到不小于的位置这时候将插入的值放在此位置,
* 由于之前的值都提前了一位,所以不存在值被覆盖而丢失
* @param array
* @return
*/
public int[] insertSort(int[] array){
long a=System.currentTimeMillis();
for (int i = 1; i < array.length; i++) {
int index=i; // 纪录自己的位置 大的时候不变化 小的时候减
int tmp=array[i]; //记录自己的值
for ( ; index>0 &&tmp<array[index-1]; index--) {
array[index]=array[index-1];
//执行完后index减1在判断
}
array[index]=tmp;
}
long b=System.currentTimeMillis();
System.out.println("插入排序用时:"+(b-a)+"毫米");
return array;
}
希尔排序:
实现步骤:
1 设置gap序列即增量序列,最后一次gap必须是1
2 将相距gap的一组数按照插入排序(注意 插入排序从第二个开始)
3 插入排序 增量为gap 而不是1
/**
* 希尔排序是在插入排序基础上改善的排序
* 插入排序思想 从第二个值开始 判断与前一个值的大小
* @param array
* @return
*/
public int[] shellSort(int[]array){
long a=System.currentTimeMillis();
for(int gap=array.length/2;gap>0;gap=gap==2?1:(int)(gap/2.2)){ //算法书上说除以2.2效率最高
// 20个数 gap为 10 4 1
for(int i=gap;i<array.length;i++){
int index=i;
int tmp=array[i];
for(;index>=gap&&tmp<array[index-gap];index-=gap){
array[index]=array[index-gap];
}
array[index]=tmp;
}
// System.out.println(Arrays.toString(array));
}
long b=System.currentTimeMillis();
System.out.println("插入排序用时:"+(b-a)+"毫米");
return array;
}
插入排序:由N-1趟排序组成,第i趟排序保证位置0到i-1上元素是已经排好序的。
在该算法代码实现中使用了可以减少元素交换次数的技巧:在for循环内,实现了数组元素移动而没有明显使用交换。将插入排序的搜索插入位置的过程和移动元素的过程合并一起进行,从而减少了元素交换次数。位置i上的元素存储在tmp中,而位置i之前的所有更大的元素都被向右移动一个位置;然后tmp被放置在正确的位置上。
该算法的平均时间为O(N^2)。希尔排序是为了冲破二次时间的屏障,但是最终证明,其时间最坏情况为O(N^2),