直接插入排序

来源:互联网 发布:软件项目验收申请报告 编辑:程序博客网 时间:2024/06/03 19:52

上一篇写了技术基数排序,这节是关于插入排序!

插入排序的思想十分简单,打扑克牌的时候我们给牌放位置的方法就是直接插入排序。

首先我们拿到第一张牌的时候 例如 8,这个时候它是第一张,所以不需要比较,可以确定暂时的位置是0 (数组的下标从0开始,在这里就用0了)。然后拿到了一张 5,这个时候把5与前面的牌像比较,5 < 8,所以5应该插到8的前面去,8应该往后移动一位。此时在【0】的位置上是5,在【1】的位置上是8,之后我们拿到了 9,与前面的牌相比较是有序的,所以不需要做调整,9的位置就是【2】,然后我们又拿到了7此时,与前面的数值一一比较,从前往后找到第一个大于7的数字,该牌的位置就是7应该在的位置,那么此时【1】位置上换成7,8和9依次向后移动一位。【2】的位置上是8, 【3】的位置是9。然后我们拿到牌之后都是按照这个方法来调整即可。

下面是实现的代码:

public class InsertSort implements Sort {    public static void main(String[] s) {        Sort sort = new InsertSort();        int arr[] = {-12, 5, 6, -5, -5, 569, 125, -58, 9, 36};        sort.sort(arr);    }    @Override    public void sort(int[] arr) {        for (int i = 1; i < arr.length; i++) {            int insertPosition = -1;            int cache = arr[i]; //缓存当前的值            //从前面排好序的数字中间找到第一个大于当前数字的,它的位置就是当前数字应该在的位置。            for (int m = 0; m < i; m++) {                if (arr[i] < arr[m]) {                    insertPosition = m;                    break;                }            }            //如果找到了了,就把数字依次往后移动一位。            if (insertPosition != -1) {                for (int j = i; j > insertPosition && insertPosition != -1; j--) {                    arr[j] = arr[j - 1];                }                // 把当前数字放到腾出来的位置上去。                arr[insertPosition] = cache;            }            for (int el : arr) {                System.out.print(el + " ");            }            System.out.println();        }    }}

直接插入排序是稳定的,我们从前往后排序的时候,两个相同的值先出现的必定排在后出现的前面。

最后算法的时间复杂度上是O(n^2)

1 0
原创粉丝点击