zoukankan      html  css  js  c++  java
  • 排序02--[插入排序&&插入排序优化&&二分搜索]

    1.插入排序(Insertion Sort)

    1.基本介绍

     1.2baseline算法实现

        @Override
        protected void sort() {
            for (int begin = 1; begin < array.length; begin++) {
                int cur = begin;
                while (cur > 0 && cmp(cur, cur - 1) < 0) {
                    swap(cur, cur - 1);
                    cur--;
                }
            }
        }
    View Code

    2.插入排序优化1--挪动

    主要思路:

    相对于baseline优化算法是 把交换的操作变成了挪动操作

    2.1插入排序--逆序对(Inversion)

    2.2插入排序优化

    3.插入排序优化1--二分搜索

    主要思路:

    相对于优化1 主要将里面的搜索算法(遍历搜索算法)定位需要挪动的部分 通过二分搜索算法进行 定位 

    3.1二分搜索

    3.2二分搜索--思路

    3.3二分搜索实例

    3.4二分搜索--实现

        /**
         * 查找v在有序数组array中待插入位置
         */
        public static int search(int[] array, int v) {
            if (array == null || array.length == 0) return -1;
            int begin = 0;
            int end = array.length;
            while (begin < end) {
                int mid = (begin + end) >> 1;
                if (v < array[mid]) {
                    end = mid;
                } else {
                    begin = mid + 1;
                }
            }
            return begin;
        }
    View Code

    3.5插入排序---二分搜索优化

    3.6插入排序--二分搜索优化--思路

    3.7插入排序-二分搜索优化--实例

    3.8插入排序-二分搜索优化--实例2

     

    3.9插入排序-二分搜索优化--实例3

    3.10插入排序-二分搜索优化--实现

    @Override
        protected void sort() {
            for (int begin = 1; begin < array.length; begin++) {
                insert(begin, search(begin));
            }
        }
        
        /**
         * 将source位置的元素插入到dest位置
         * @param source
         * @param dest
         */
        private void insert(int source, int dest) {
            T v = array[source];
            for (int i = source; i > dest; i--) {
                array[i] = array[i - 1];
            }
            array[dest] = v;
        }
        
        /**
         * 利用二分搜索找到 index 位置元素的待插入位置
         * 已经排好序数组的区间范围是 [0, index)
         * @param index
         * @return
         */
        private int search(int index) {
            int begin = 0;
            int end = index;
            while (begin < end) {
                int mid = (begin + end) >> 1;
                if (cmp(array[index], array[mid]) < 0) {
                    end = mid;
                } else {
                    begin = mid + 1;
                }
            }
            return begin;
        }
    View Code
  • 相关阅读:
    【Java小项目】一个Socket连续传输多个文件
    【Java小项目】图片浏览器
    【Java小项目】山寨QQ
    Git学习笔记
    【Java爬虫】爬取南通大学教务系统成绩计算绩点
    【Little_things】事件驱动的带界面的Client/Server聊天小程序(java socket)
    【Little_things】简单的Client/Server通信小程序(java socket)
    Codeforces Round #222 (Div. 1) (ABCDE)
    2019 牛客多校五 F. maximum clique 1 (最大团)
    Student's Camp CodeForces
  • 原文地址:https://www.cnblogs.com/ggnbnb/p/12552429.html
Copyright © 2011-2022 走看看