排序算法:插入排序

简介: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法将n个元素的数列分为已有序和无序两个部分,如 下所示:{{a1},{a2,a3,a4,…,an}}{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}…{{a1(n-1),a2(n-1) ,…},{an(n-1)}}每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。

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

将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();
    }

}
目录
相关文章
|
3月前
|
算法 搜索推荐 C#
|
4月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
4月前
|
算法 搜索推荐
数据结构与算法-插入排序
数据结构与算法-插入排序
28 2
|
4月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
4月前
|
人工智能 搜索推荐 JavaScript
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
心得经验总结:排序算法:插入排序法(直接插入法和希尔排序法)
27 0
|
4月前
|
机器学习/深度学习 搜索推荐 算法
【C/排序算法】:直接插入排序和希尔排序
【C/排序算法】:直接插入排序和希尔排序
33 0
|
4月前
|
搜索推荐 算法
排序算法之插入排序
排序算法之插入排序
34 0
|
4月前
|
搜索推荐
排序算法---插入排序-----详解&&代码
排序算法---插入排序-----详解&&代码
|
4月前
|
人工智能 算法 C语言
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)
31 0
|
5月前
|
存储 算法 搜索推荐
【数据结构与算法】:插入排序与希尔排序
欢迎大家来到初阶数据结构的最后一小节:排序
【数据结构与算法】:插入排序与希尔排序
下一篇
无影云桌面