排序算法:插入排序

简介: 排序算法:插入排序

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


将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();
    }
}
目录
相关文章
|
4月前
|
机器学习/深度学习 存储 算法
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
46 1
|
12天前
|
人工智能 搜索推荐 Shell
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
|
14天前
|
搜索推荐 算法 Shell
【数据结构与算法】直接插入排序和希尔排序
【数据结构与算法】直接插入排序和希尔排序
|
16天前
|
机器学习/深度学习 搜索推荐 算法
【排序算法】插入排序与选择排序详解
【排序算法】插入排序与选择排序详解
|
1月前
|
搜索推荐 Python
Python实现插入排序算法
Python实现插入排序算法
10 1
|
1月前
|
搜索推荐 C#
C#实现插入排序算法
C#实现插入排序算法
12 1
|
1月前
|
搜索推荐 Java
Java实现插入排序算法
Java实现插入排序算法
11 0
|
2月前
|
搜索推荐 Python
python实现插入排序算法。
python实现插入排序算法。
13 4
|
2月前
|
搜索推荐 算法 Java
【数据结构排序算法篇】----插入排序【实战演练】
【数据结构排序算法篇】----插入排序【实战演练】
32 1

热门文章

最新文章