八大排序之简单插入排序

排序算法

冒泡排序

简单选择排序

直接插入排序

希尔(shell)排序

快速排序

归并排序

简单插入排序

排序原理:

  1. 把所有的元素分为两组,已经排序的和未排序的;
  2. 找到未排序的组中的第一个元素,向已经排序的组中进行插入;
  3. 倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。
    在这里插入图片描述
    对第五趟排序分析
    在这里插入图片描述

每一次插入,相当于取最小的冒泡排序,区别在于这是冒泡的最小的数。

java代码

import java.util.Arrays;
public class InsertSort {
    
    

    public static void sort(int[] a){
    
    
        //从下标为1的开始,对每个数字都进行比较。
        for(int i = 1 ; i<a.length;i++){
    
    
            //反向冒泡
            for(int j = i; j>0; j--){
    
    
                if(a[j]<a[j-1]){
    
    
                    int temp = a[j];
                    a[j] = a[j-1];
                    a[j-1]= temp;
                }else{
    
    
                    //前面是排好序的,一定更小
                    break;
                }
            }
        }
    }

    public static void main(String[] args) {
    
    
        int[] a = {
    
    1,5,3,2,6,4,9,8,7};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

时间复杂度分析

插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复
杂度,主要分析一下内层循环体的执行次数即可。
最坏情况,也就是待排序的数组元素为{12,10,6,5,4,3,2,1},那么:
比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)
(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终插入排序的时间复杂度为O(N^2).

稳定性分析

稳定

比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么把要插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

猜你喜欢

转载自blog.csdn.net/ren9436/article/details/108890677