八大排序算法之直接插入排序(InsertionSort)

博客 动态
0 142
羽尘
羽尘 2022-03-01 09:55:56
悬赏:0 积分 收藏

八大排序算法之直接插入排序(InsertionSort)

常见的排序算法
image
今天复习【直接插入排序】
核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置

`

public class InsertionSort {// 核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置public void myInsertSort(int[] arr) {    int len = arr.length;    for (int i = 1; i < len; i++) {        // 查找位置插入 -- 可能存在二分查找进行优化        int toInsert = arr[i];        int toPos = 0;        while (arr[toPos] <= toInsert && toPos < i) {            toPos++;        }        // 插入到 toPos 位置        if (toPos != i) {            System.arraycopy(arr, toPos, arr, toPos + 1, i - toPos);            arr[toPos] = toInsert;        }    }}// 针对位置插入 从后向前 边判断大小,边移动元素public void insertSortOpt(int[] arr) {    int len = arr.length;    for (int i = 1; i < len; i++) {        // 从后往前移动元素        int toInsert = arr[i];        for (int pos = i; pos >= 0; pos--) {            if (pos > 0 && arr[pos - 1] > toInsert) {                arr[pos] = arr[pos - 1];            } else {                arr[pos] = toInsert;                break;            }        }		// 这种情况 解决不了插入位在第 0 位的情况//            for (int pos = i - 1; pos >= 0; pos--) {//                if (arr[pos] > toInsert) {//                    arr[pos + 1] = arr[pos];//                } else {//                    arr[pos + 1] = toInsert;//                    break;//                }//            }        }    }public void insertSortSwap(int[] arr) {    // 此刻 i 标记的有序数组最后一位    for (int i = 0; i < arr.length - 1; i++) {        for (int j = i + 1; j > 0; j--) {            if (arr[j] >= arr[j - 1]) {                break;            }            // 交换            int tmp = arr[j];            arr[j] = arr[j - 1];            arr[j - 1] = tmp;        }    }}public void insertSortBinary(int[] arr) {    for (int i = 1; i < arr.length; i++) {        // 通过二分 查找插入位置        // 边界 0、i两种情况,返回何值比较合适        int toInset = arr[i];        int pos = binarySearch(arr, i - 1, toInset);        if (pos != i) {            System.arraycopy(arr, pos, arr, pos + 1, i - pos);            arr[pos] = toInset;        }    }}public int binarySearch(int[] arr, int end, int key) {    int left = 0;    int right = end;    while (left <= right) {        int mid = (left + right) >>> 1;        if (key >= arr[mid]) {            left = mid + 1;        } else {            right = mid - 1;        }    }    return left;}public static void main(String[] args) {    InsertionSort testClass = new InsertionSort();    int[] arr = new int[]{49, 38, 65, 97, 76, 13, 27, 49, 55, 4};    testClass.insertSortBinary(arr);    System.out.println(Arrays.toString(arr));}}

`

posted @ 2022-03-01 09:55 spongie 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员