插入排序
1.直接插入排序
时间复杂度:O(n^2) O(n) O(n^2) (最坏 最好 平均)
空间复杂度:O(1)思想:每次将一个待排序的数据按照其关键字的大小插入到前面已经排序好的数据中的适当位置(前面有序,后面无序),直到全部数据排序完成。
稳定性: 稳定 每次都是在前面已排好序的序列中找到适当的位置,只有小的数字会往前插入(比较),所以原来相同的两个数字在排序后相对位置不变。代码:
/** * 插入排序 */public static void insertSort(int[] array) {//插入排序 for (int i = 1; i < array.length; i++ ) { int temp = array[i]; int j = i; while (j >= 0 && array[j-1] > temp) { array[j] = array[j-1]; j--; } array[j] = temp; }}
2.希尔排序
时间复杂度:O(n2) O(n) O(n1.5) (最坏,最好,平均)
空间复杂度:O(1)思想:希尔排序根据增量值对数据按下标进行分组,对每组使用直接插入排序算法排序;当增量减至1时,整体采用直接插入排序得到有序数组。
稳定性:不稳定 因为是分组进行直接插入排序,原来相同的两个数字可能会被分到不同的组去,可能会使得后面的数字会排到前面,使得两个相同的数字排序前后位置发生变化。代码:public static void shellSort(int[] array) {//希尔排序 int gap; gap = array.length / 2; // 分成n/2组 while (gap >= 1) { for (int i = gap; i < array.length; ++i) { //对每组进行直接插入排序 int temp = array[i]; int j = i; while (j >= 0 && array[j-gap] > temp) { array[j] = array[j-gap]; j -= gap; } array[j] = temp; } gap /= 2; }}