排序算法——插入排序

排序算法——插入排序

插入排序也是经典的排序算法之一,同选择排序一样,插入排序也将数据分为有序区,和无序区。在选择排序中,需要遍历无序区间,找到无序区间的最小数据,然后放入有序区间的末尾但是在插入排序中需要将a[i],(i 之前是有序区间),在有序区间中找到合适的位置并且插入。详细操作如下

  1. 定义a[0]…..到 a[n-1] 的N位数的数组,并且默认a[0]是有序区间。
  2. 将a[1] 与有序区间a[0]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1]
  3. 将a[2] 与有序区间a[0],a[1]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1] a[2]
  4. 将a[i] 与有序区间a[0],a[1]…..a[i-1]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1] ….a[i-1]
  5. 当前索引 i 左边的所有元素都是有序的,但它们的最终位置还不确定,为了给
    更小的元素腾出空间,它们可能会被移动。但是当索引 i 到达数组的右端时(N-1),数组排序就完成了

具体操作如下:

package com.hbcode.sort;

/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:插入排序
 * Date:2018/1/10
 * Time:8:40
 */
public class Insertion {

    public static void  main(String[] agrs){

        double[] data = {1,2,1,6,7,81,2,3123,42,321};
        sort(data);
        disPlay(data);

    }
    public static void sort(double[] data){
        int length = data.length;
        //初始认为data[0]是有序区间
        //data[1]到data[data.length - 1] 是无序区间
        for(int i= 1;i < length;i++){
            //将 a[i] 插入有序区间a[0] 到 a[i - 1 ]之中
            for(int j = i;j > 0;j--){
                //将a[i],逐一与有序区间的数据进行比较,直到找到合适的位置
                if(less(data[j],data[j-1])){
                   each(data,j,j-1);
                }else{
                    break;
                }
            }
        }
    }

    public static void disPlay(double[] data){
        for (int i =0; i <data.length;i++){
            System.out.print(data[i] + "  ");
        }
    }

    /**
     * 交换两数位置
     * @param data
     * @param i
     * @param j
     */
    public static void each(double[] data,int i,int j){
        double temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    /**
     * 比较两数的大小
     * @param a
     * @param b
     * @return
     */
    public static boolean less(double a,double b){
        return  a < b ? true:false;
    }
}

这里写图片描述

插入排序主要是通过当前数据a[i]与有序区间的数据进行比较,然后向后移动比较大的数据,最后插入,在比较的时候由于不知道插入的最终位置,可能是有序区间中比较大的数据向后移动。

猜你喜欢

转载自blog.csdn.net/hubin916/article/details/79085922