zoukankan      html  css  js  c++  java
  • 排序算法:插入排序

    有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法

    将n个元素的数列分为已有序和无序两个部分,如
    下所示:

    {{a1},{a2,a3,a4,…,an}}

    {{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}

    {{a1(n-1),a2(n-1) ,…},{an(n-1)}}

    每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。

    算法步骤

    ⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;

    ⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;

    ⒊重复第二步,共进行n-i次插入处理,数列全部有序。

    package cn.hncu;
    
    public class insertSort {
        public static void main(String[] args) {
            int[] a = new int[1000];
            for(int i=0;i<a.length;i++){
                a[i] = (int)(Math.random()*a.length);
            }
            long startTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。
            //1 插入排序
            //insertSort(a);
    
    
            //1.1 结合二分法的插入排序
            insertSort2(a);
    
    
            print(a);
            long endTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。
            System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
    
    
        }
    
        private static void insertSort(int[] a) {
            for(int i=0;i<a.length-1;i++){
                int temp=a[i+1];
                int j=i;
                while(a[j]>temp){
                    a[j+1]=a[j];
                    j--;
                    if(j<0){
                        break;
                    }
    
                }
                a[j+1]=temp;
            }
        }
    
        private static void insertSort2(int[] a) {
            for(int i=0;i<a.length-1;i++){
                int temp=a[i+1];
    
                int low = 0;
                int high = i;
                int mid;
                 //在low与high之间的区域进行二分查找:
                //找到新插入元素的位置
                while(low<=high){
                    mid=(low+high)/2;
    
                    if(a[mid]>temp){
                        high=mid-1;
                    }else{
                        low=mid+1;
                    }
                }
                //经过上面的二分查找,得到新元素的位置是:high+1
                //把[high+1,i]区间内的所有元素往后移一个位置
                for(int j=i;j>high;j--){
                    a[j+1]=a[j];
                }
                a[high+1]=temp;
            }
        }
    
        private static void print(int[] a) {
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
        }
    
    }
    
  • 相关阅读:
    前端知识 | 一个简单的登录页面包含多少前端基础知识?
    SQLserver查询作业、视图、函数、存储过程中的关键字
    SQL server 数据库备份至服务器本地磁盘和其他服务器磁盘
    Linux(centos)安装vim
    CentOS6 7 8更换阿里yum源
    centos8 最小化安装 无 ifconfig,netstat 的安装
    修改MySQL用户的host属性
    阿里云NTP服务器(国内可用的NTP服务器)
    vCenter Server Appliance(VCSA )7.0 部署指南
    Chrome离线安装包最新版
  • 原文地址:https://www.cnblogs.com/webmen/p/5739380.html
Copyright © 2011-2022 走看看