插入排序:排序算法简单排序入门必学排序之一。

排序原理:
1.把所有的元素分为两组,已经排序的和未排序的;
2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;
3.倒序遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素**小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;

算法图示:

代码实现:

  public static void insertSort(int []arr){
   
	for(int i=1;i<arr.length;i++){
   
		for(int j=i-1;j>=0 && arr[j]>arr[j+1];j--){
   
			 swap(arr,j,j+1);
			}
		}
	}
    public static void swap(int []arr,int i,int j){
   
        int temp = arr[i];
        arr[i]  =arr[j];
        arr[j]  = temp;
    }

API实现:

package 排序类算法;/* *@Author:Tstr *@Date:2020/8/15 21:48 *@from:lenovo *@e-mail:x20135201314boy@126.com */

public class MyInsertionSort {
   
    //排序核心
    public static void Sort(Comparable[] a){
   
        for (int i = 1; i <a.length ; i++) {
   
            for (int j = i; j >0; j--) {
   
             if (compare(a[j-1],a[j])) {
   
                   swop(a,j-1,j);
                }else{
   
                 break;
             }
            }
        }
    }
    //比较相邻元素大小关系
    public static boolean compare(Comparable x,Comparable y){
   
        return x.compareTo(y)>0;//既是x>y
    }
    //元素交换
    private static void swop(Comparable[] a,int i,int j){
   
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

测试:

package 排序类算法;/* *@Author:Tstr *@Date:2020/8/15 21:58 *@from:lenovo *@e-mail:x20135201314boy@126.com */

import java.util.Arrays;

public class MyInsertionTest {
   
    public static void main(String[] args) {
   
        Integer[] testarr = {
   4,6,8,7,9,2,10,-1};
       MyInsertionSort.Sort(testarr);
        System.out.println(Arrays.toString(testarr));
    }
}

结果展示:

复杂度分析:
插入排序使用了双层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).

PS:自此,经典排序算法中复杂度相同为O(n^2)的排序就结束了,之后将更新高级排序算法
声明:文中涉及图片来自网络,如有侵权,请联系博主删除!