排序算法之插入排序

来源:互联网 发布:java 运行环境下载 编辑:程序博客网 时间:2024/06/08 15:12

插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。简单来说插入排序就是把小的插入已经排序序列的前面,已经排序的序列向后移位。

先写个简单的例子:

public class Test {public static void main(String[] args) {int[] values = { 8, 5, 6, 1, 7, 0 };values = sort(values);for (int i : values)System.out.print(i + " ");}public static int[] sort(int[] values) {if (values == null || values.length <= 1)return values;int i, j, key;for (i = 1; i < values.length; ++i) {key = values[i];for (j = i - 1; j >= 0; --j) {if (values[j] > key)values[j + 1] = values[j];elsebreak;}values[j + 1] = key;}return values;}}

如果后面的都是小值那么,它的效率并不高,如果后面都是大值,则需要移动的数据可能非常少,所以说他是不稳定的排序。

插入排序还有升级版,折半插入法,例如

public class Test {public static void main(String[] args) {int[] values = { 8, 5, 6, 1, 7, 0 };values = sort(values);for (int i : values)System.out.print(i + " ");}public static int[] sort(int[] values) {if (values == null || values.length <= 1)return values;// start开始位置,end结束位置,middle中间位置int start, end, middle;// 当前值int key;for (int i = 1; i < values.length; i++) {key = values[i];start = 0;end = i - 1;// 不断折半查找需要插入的位置while (start <= end) {middle = (start + end) / 2;if (key < values[middle])end = middle - 1;elsestart = middle + 1;}// 移动数据for (int j = i - 1; j >= end + 1; --j)values[j + 1] = values[j];values[end + 1] = key;}return values;}}

折半插入法,实际上是折半查找的应用。每次循环当前值前面的都是已经排好序的,拿当前值在前面已经排好序的数据中查找应该插入的位置,找到位置后只需要移动后面的数据就可以了。