普通插入排序:
将n个元素看成一个有序列表和一个无序列表,将无序列表中的数据插入到有序列表中。
public static void insertSort(int[] arr){
int insertIndex=0;
int inserValue=0;
//使用for循环完成
for (int i = 1; i < arr.length; i++) {//从索引为1处开始,直到最后一个
//首先定义需要插入的数的索引
insertIndex = i ; // 即arr[1]的前面这个数的下标
inserValue=arr[i];//待插入的数值
//!!!!!注意能在while循环条件判断()里面加判断条件,就加。
//!!!! 如果在while循环里面多添加一个if判断, 两者时间相差很大
while (insertIndex-1>=0 && arr[insertIndex-1]>inserValue){
//此时不是交换,而是移位
arr[insertIndex]=arr[insertIndex-1];
insertIndex--;
}
//优化
if (insertIndex!=i) {//insertIndex值没有改变过
arr[insertIndex] = inserValue;
}
}
希尔排序,也叫缩小增量排序。缩小的是带插入元素与前面第几个位置之间的下标差。
public static void shelltSort(int[] arr){
int insertIndex=0;
int inserValue=0;
//注意这里就是来缩小增量了,通过引入步长来改变
//步长开始为数组长度/2;后面不断/2,找到step=0,跳出循环
for(int step=arr.length/2;step>0;step/=2){
//使用for循环完成
//注意此时的i不再等于1,而是等于step
for (int i = step; i < arr.length; i++) {//从索引为step处开始,直到最后一个
//首先定义需要插入的数的索引
insertIndex = i ; // 即arr[1]的前面这个数的下标
inserValue=arr[i];//待插入的数值
//!!!!!注意能在while循环条件判断()里面加判断条件,就加。
//!!!! 如果在while循环里面多添加一个if判断, 两者时间相差很大
while (insertIndex-step>=0 && arr[insertIndex-step]>inserValue){
//此时不是交换,而是移位
arr[insertIndex]=arr[insertIndex-step];
insertIndex-=step;
}
//优化
if (insertIndex!=i) {//insertIndex值没有改变过
arr[insertIndex] = inserValue;
}
}
}
速度测试:
创建要给80000个的随机的数组,分别进行插入和希尔排序
希尔排序要明显由于插入排序。