插入排序:插入排序指的是每次讲待排序的数据插入到已排序好序列的 正确位置。
比如站队时我们让学生的从低到高排列,后面来的学生需要将自己插入到队伍的正确位置中。
伪代码:
//升序排列
InsertSort(array)
for j = 2 to array.length
value = array[j]
i = j - 1
while (i > 0 and a[i] > value)
array[i + 1] = array[i]
i = i - 1
array[i + 1] = value
java代码:
import java.util.Arrays;
public class InsertSortTest {
public static void main(String[] args) {
int[] arr = {56, 22, 44, 10, 15, 12, 1, 123, 34, 123};
System.out.println("before: " +Arrays.toString(arr));
InsertSortTest inSort = new InsertSortTest();
int[] result = inSort.insertSort(arr);
System.out.println("after: " + Arrays.toString(result));
}
//升序排列
public int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j = i - 1;
while(j >= 0 && arr[j] > temp ) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}
}
时间复杂度:
1.最坏的情况
数组是倒序的,此时花的时间最长。插入第二个元素时需要与第一个比较,插入第三个元素时需要与第二个元素比较,。。。依次类推
数组的第n个需要比较(n - 1)次。对比较次数的等差数列求和结果为n(n-1)/2, 最坏的情况下时间复杂度为O(n^2)
2.最好的情况
数组是正序的,每次插入只需要比较前面一个元素,n个元素的数组共需要比较(n - 1)次,因此最好情况下时间负责度为O(n)