//未优化的插入排序
public static void cha_sort(int[] a) {
//默认第一个元素有序,从第二个元素开始
for (int i = 1; i < a.length; i++) {
for(int j = i-1; j >= 0; j--){
if(a[j+1] < a[j]){ //直接交换
int tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
}else break;
}
}
}
/**
* 插入排序-稳定---稍微优化
* 时间复杂度
* 最好:O(n)
* 最坏:O(n^2)
* @param a 待排序的数组
*/
public static void insert_sort(int a[]){
for(int i = 1; i < a.length; i++){ //i从1开始,默认0位置已经是有序的,因为只有一个元素
int temp = a[i]; //临时存储要插入的元素,即temp是要插入的元素,此时的位置i是认为是空的,因为保存该位置的值了temp
int j = 0; //j的下标就是要插入的位置,即将a[i]插入到下标为j的位置
//j从i开始找往前找
for(j = i; j > 0 && a[j-1] > temp; j--) //寻找插入位置
a[j] = a[j-1]; //一个一个往后移
/**
* a[j] = temp有两种情况
* 1、j = 0时:此时表示将元素temp插入到a[0]的位置,因为该元素temp是最小的
* 2、当a[j-1] <= temp时:找到j-1位置的元素小于等于temp,说明要插入的位置为j-1的后一个,即j
*/
a[j] = temp; //这里只需要交换一次,不需要每次都交换。
}
System.out.println(Arrays.toString(a));
}