排序算法——插入排序
插入排序也是经典的排序算法之一,同选择排序一样,插入排序也将数据分为有序区,和无序区。在选择排序中,需要遍历无序区间,找到无序区间的最小数据,然后放入有序区间的末尾。但是在插入排序中需要将a[i],(i 之前是有序区间),在有序区间中找到合适的位置并且插入。详细操作如下
- 定义a[0]…..到 a[n-1] 的N位数的数组,并且默认a[0]是有序区间。
- 将a[1] 与有序区间a[0]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1]
- 将a[2] 与有序区间a[0],a[1]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1] a[2]
- 将a[i] 与有序区间a[0],a[1]…..a[i-1]的数据比较,找到合适的位置并插入,有序区间变成a[0] a[1] ….a[i-1]
-
当前索引 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 = {,,,,,,,,,};
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= ;i < length;i++){
//将 a[i] 插入有序区间a[0] 到 a[i - 1 ]之中
for(int j = i;j > ;j--){
//将a[i],逐一与有序区间的数据进行比较,直到找到合适的位置
if(less(data[j],data[j-])){
each(data,j,j-);
}else{
break;
}
}
}
}
public static void disPlay(double[] data){
for (int i =; 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]与有序区间的数据进行比较,然后向后移动比较大的数据,最后插入,在比较的时候由于不知道插入的最终位置,可能是有序区间中比较大的数据向后移动。