欢迎交流讨论,转载请注明出处!
插入排序(insertion Sort) 的算法描述是一种简单直观的排序算法。其工作原理是通过构建有序
序列,对于为排序数据,在已排序序列中从后向前开始扫描,找到相应的位置并进行插入操作。插
入排序一般只需要用到O(1)的空间,因而在从后向前扫描的时候,需要将排好序的元素进行挪动
为最新元素提供插入位置。
首先看看插入排序的动态演示:
算法描述:
1、从第一个元素开始,可以被认为已经排好序了。
2、取下一个元素,在已经排好的元素序列中从后向前扫描。
3、如果该元素(已排序)大于新元素,则将该元素一到下一位置。
4、重复步骤3,直到已排序的元素小于或等于新元素的位置
5、将新元素插入该位置。
6、重复步骤2~5
Tips:这里如果比较操作的代价过大的话,可以使用二分查找法进行优化。减少比较的次数。
其工作过程看下面的动态图
看看代码实现吧:
package com.kiritor;
import java.util.Arrays;
/**
* 插入排序的简单实现
*
* @author Kiritor
*/
public class Sort<T> {
public static <T extends Comparable<? super T>>
T[] insert_sort(T[] a) {
int j;
for (int p = 1; p < a.length; p++) {
T tmp = a[p];
for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--)
a[j] = a[j - 1];//元素后移
a[j] = tmp;//插入
System.out.println(Arrays.toString(a));
}
return a;
}
public static void main(String[] args) {
Integer[] integer ={12,1,423,123,6,5,10,8};
System.out.println(Arrays.toString(insert_sort(integer)));
}
}
那么插入排序的时间复杂、空间复杂又是什么情况呢?