• java排序算法(七):折半插入排序


    java排序算法(七):折半插入排序

      折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入。不同之处在于第i趟插入。先找出第i+1个元素应该插入的位置。假设前i个数据是已经处于有序状态

      代码实现

      

    package com.spring.test;
    
    /**
     * 折半插入排序
     */
    public class BinaryInsertSort {
        public static void main(String[] args) {
            int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
            print(data);
            binaryInsertSort(data);
            print(data);
        }
    
        /**
         * 折半插入
         * @param data
         */
        public static void binaryInsertSort(int[] data){
            for(int i=1;i<data.length;i++){
                if(data[i] < data[i-1]){
                    //缓存i处的元素值
                    int tmp = data[i];
                    //记录搜索范围的左边界
                    int low = 0;
                    int high = i-1;
                    while(low <= high){
                        //记录中间位置
                        int mid = (low+high)/2;
                        //比较中间位置数据和i处数据大小,以缩小搜索范围
                        if(data[mid] < tmp){
                            low = mid +1;
                        }else{
                            high = mid - 1;
                        }
                    }
                    //将low---i处的数据整体向后移动1位
                    for(int j = i;j>low;j--){
                        data[j] = data[j-1];
                    }
                    data[low] = tmp;
                    print(data);
                }
            }
        }
    
    
        /**
         * 对两个数据进行交换
         * @param data
         * @param i
         * @param j
         */
        public static void swap(int[] data,int i,int j){
            if(i==j){
                return ;
            }
            data[i] = data[i] + data[j];
            data[j] = data[i] - data[j];
            data[i] = data[i] - data[j];
        }
    
        /**
         * 对数组进行打印输出
         * @param data
         */
        public static void print(int[] data){
            for(int i=0;i<data.length;i++){
                System.out.print(data[i]+"	");
            }
            System.out.println();
        }
    }

    运行结果

  • 相关阅读:
    自主学习之RxSwift(一) -----Driver
    RxSwift:ReactiveX for Swift 翻译
    C简单实现动态顺序表
    C简单实现双向链表
    C实现单链表
    享受这一点点的平淡
    C文件读写
    大神都在看的RxSwift 的完全入坑手册
    字符串常量存在何处
    认识自己
  • 原文地址:https://www.cnblogs.com/hanxue112253/p/8474012.html
Copyright © 2020-2023  润新知