java插入排序

来源:互联网 发布:中文域名收录 编辑:程序博客网 时间:2024/06/14 06:38

插入排序

插入排序核心思想:

        初始数列:    {{a1}, {a2, a3, a4, ..., an}}
        第一趟排序:    {{a1, a2}, {a3, a4, ..., an}}
        第二趟排序:    {{a1, a2, a3}, {a4, ..., an}}
        ...
        倒数第二次排序:    {{a1, a2, a3, a4, ...}, {an}}

        最后一次排序:    {{a1, a2, a3, a4, ..., an}}


归纳步骤:
        1:从第一个下表开始,把元素插入到有序序列中 
        2:将第n个元素插入到有序序列中.
            (1)从处理元素开始,与前面的所有元素进行比较,移位
            (2)与之前的第m个元素进行比较
                如果大于:不变
                如果小于:互换值
            (3)重复步骤(2)直到第一个元素
        3:重复步骤2直到将最后一个元素插入有序序列 循环结束.

实现伪算法:

INSERT INTO(A):FOR i=1 TO length[A]-1DO key=A[i]   j=i-1   WHILE j>0 AND A[j]>keyDO A[j+1]=A[j]   j--   A[j+1]=key

验证算法的正确性:

利用循环不变式进行算法的验证:
        初始化:有序数列只有一个元素, 有序.
        保持: 假设在循环迭代的某一个次开始之前, 有序数列是有序的, 那么需要证明, 在进行下一次循环迭代开始前也是有序的.
                  将元素一次与之前的元素进行比较, 当小于的时候,互换;知道找到插入的位置 插入. 也是有序的.
        循环退出结束:当无序数列中的所有元素都排序完成, 循环退出.得到有序数列.

实现算法java:

//插入排序public class InsertSortor {// 主线程方法public static void main(String[] args) {int[] a = new int[] { 4, 8, 0, 1, 3, 9 };InsertSortor.insertSort(a);InsertSortor.printArr(a);}// 打印数组public static void printArr(int[] a) {for (int temp : a) {System.out.print(temp + ", ");}}// 插入排序算法public static void insertSort(int[] a) {// 从下标为1开始, 将元素插入到有序序列中, 循环直到最后一个元素.for (int i = 1; i < a.length; i++) {// 从要插入元素i开始, 将元素与之前的所有元素进行比较和移位, 循环直到第二个元素与第一个元素进行比较.for (int j = i; j > 0; j--) {// 如果前一个元素, 小于后一个元素, 则互换元素if (a[j] < a[j - 1]) {int temp = a[j];a[j] = a[j - 1];a[j - 1] = temp;}// 如果前一个元素, 大于后一个元素, 则直接跳出内层循环,继续下一次外层循环else {break;}}}}}


0 0