插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法步骤:
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
算法图示:
算法基本性能
排序方法 | 平均时间复杂度情况 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
Java代码
package com.sort; import java.util.Random; public class Main { // 从小到大 private static void sort(int[] array) { if (array.length <= 1) { return; } for (int i = 1; i < array.length; i++) { /** * 因为0~i-1为有序的,如果i位置的大于i-1位置的,说明0~i也是有序的, * 反之需要在0~i-1直接找出i位置的元素的正确位置插入 */ if (array[i] < array[i - 1]) { /** * 先保存i位置元素 */ int temp = array[i]; int j = i - 1; /** * 从i-1开始向前查找,一直到找到比i位置元素小的位置,然后插入 */ for (; j >= 0 && array[j] > temp; j--) { /** * 没有找到,那么将此位置的元素后移一位,腾出位置 */ array[j + 1] = array[j]; } /** * 将i位置元素放在腾出的位置上面 */ array[j + 1] = temp; } } } /** * 获取指定长度的随机数组 */ public static int[] getRandomArray(int n) { int[] array = new int[n]; Random random = new Random(); for (int i = 0; i < array.length; i++) { array[i] = random.nextInt(500); } return array; } /** * 打印指定数组 */ public static void outputArray(int[] array) { for (int i : array) { System.out.print(i + " "); } System.out.println(""); } public static void main(String[] args) { int[] array = getRandomArray(10); outputArray(array); sort(array); outputArray(array); } }