插入排序
定义
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,直到全部插入完为止。
适用于少量数据的排序
稳定性
稳定
时间复杂度
O(N2)
代码
测试用例
int arr[] = {2,4,3,1,6,5};
原代码
/**
* 直接插入排序
* @param arr
* @param len arr.length
*/
public static void insertSort(int[] arr,int len){
System.out.println("初始数据 "+ Arrays.toString(arr));
// i用作下标;i从1开始,因为一个元素就是有序的 不需要再排
for(int i=1;i<len;i++){
System.out.println("\n第"+i+"轮");
int temp = arr[i]; // 防止数据丢失 为下面后移元素做准备
System.out.println("哨兵:"+temp);
// 倒着比较,每次加入一个元素和左侧已经排序好的序列作比较
// 左侧元素比temp大的时候 为temp腾位置 j接着左移
int j;
for (j=i;j>0 && arr[j-1]>temp; j--){
arr[j] = arr[j-1];
System.out.println("第"+i+"_"+(i-j+1)+"次交换:" + Arrays.toString(arr));
}
//跳出循环的时候 要么j==0 要么arr[j-1]<=temp
//j ==0 表示temp为最小值; arr[j-1]<=temp 表示temp介于排好的最大最小之间
arr[j] = temp;
System.out.println("第"+i+"轮交换结果:" + Arrays.toString(arr));
}
}
运行结果
优化 [希尔排序]
希尔排序是插入排序的一种,又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法;随着增量逐渐减少,每组包含的关键词就会越来越多,当增量减至1时,整个文件恰被分为一组,算法 完成
缺点
代码可读性差
重点
选择增量
稳定性
不稳定
时间复杂度
O(N1.3)
/**
* 希尔排序
* 插入排序的优化 用的少 代码可读性差
* 重点:选择增量 初始值为 n/2 减少了移动的次序和比较的次数
* 时间复杂度(O(n^1.3))
* @param arr
* @param len
*/
public static void shellSort(int[] arr,int len){
System.out.println("初始数据 " + Arrays.toString(arr));
int out=1; // 用于统计外层循环次数
for (int d = len/2;d>0;d/=2){
System.out.println("\n\n第"+(out++) +"次分组 "+ "分组步长:"+d);
int in = 1;//用于统计内层循环
for (int i=d;i<len;i++){
System.out.println("第"+in +"轮");
int temp = arr[i]; // 即某个组的第二个元素
int j;
// 一轮for循环进行的是多组排序
for (j=i-d;j>=0&&temp<=arr[j];j-=d){
arr[j+d] =arr[j];
}
arr[j+d]=temp;
System.out.println("第"+(in++) +"轮结果 "+Arrays.toString(arr));
}
}
}
运行结果