插入排序思路分析及代码实现
思路分析
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
算法分析
1,当初始序列为正序时,只需要外循环n-1次,每次进行一次比较,无需移动元素。此时比较次数(C min)和移动次数(Mmin)达到最小值。
C min=n-1
Mmin=0
此时时间复杂度为O(n)。
2,当初始序列为反序时,需要外循环n-1次,每次排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移i次,加上tmp=arr[i]与arr[j]=temp的两次移动,每趟移动次数为i+2,此时比较次数和移动次数达到最大值。
Cmax = 1+2+…+(n-1) = n(n-1)/2=O(n2)
Mmax = (1+2)+ (2+2)+…+(n-1+2)=(n-1)(n+4)/2=O(n2)
此时时间复杂度O(n)
3,在直接插入排序中只使用了i,j,tmp这三个辅助元素,与问题规模无关,空间复杂度为O(1)。
4,相同元素的相对位置不变,如果两个元素相同,插入元素放在相同元素后面。是一种稳定排序
代码实现
package com.sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = { 101, 34, 119, 1, -1, 89 };
insertSort(arr);
}
// 插入排序
public static void insertSort(int[] arr) {
int insertVal=0;
int insertIndex =0;
// 使用for循环进行代码简化
for (int i = 1; i < arr.length; i++) {
// 定义待插入的数
insertVal = arr[i];
insertIndex = i - 1;// 及arr[1]的前面这个数的下标
// 给insertVal 找到插入位置
// 说明
// 1.insertIndex >= 0 保证insertVal找到插入位置,不越界
// 2.insertVal<arr[insertIndex],待插入的数没有找到插入位置
// 3.就需要将arr[insertIndex]后移
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
// 当退出while循环时,说民找到插入位置,inertIndex+1
if (insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVal;
}
System.out.println("第" + i + "轮插入后");
System.out.println(Arrays.toString(arr));
}
/*
// 第一轮
// 定义待插入的数
int insertVal = arr[1];
int insertIndex = 1 - 1;// 及arr[1]的前面这个数的下标
// 给insertVal 找到插入位置
// 说明
// 1.insertIndex >= 0 保证insertVal找到插入位置,不越界
// 2.insertVal<arr[insertIndex],待插入的数没有找到插入位置
// 3.就需要将arr[insertIndex]后移
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
// 当退出while循环时,说民找到插入位置,inertIndex+1
arr[insertIndex + 1] = insertVal;
System.out.println("第一轮插入后");
System.out.println(Arrays.toString(arr));
// 第二轮
insertVal=arr [2];
insertIndex=2-1;
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
System.out.println("第二轮插入后");
System.out.println(Arrays.toString(arr));
// 第三轮
insertVal=arr [3];
insertIndex=3-1;
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
System.out.println("第3轮插入后");
System.out.println(Arrays.toString(arr));
*/
}
}