插入排序
实现一个方法,该方法的参数是int[],该方法可以对数组进行排序,例如使用【插入排序】,该方法不需要返回值。
规则:把数组分成俩部分,将后面部分的数据一个一个的和前面部分数据的元素进行比较,如果我们指定的元素比前面部分的元素小,那么就将前面的元素往前移动一步,直到没有比我们这个指定元素还小元素了,那么这个位置就是需要插入的地方。
2 1 4 9 8 5 3
例如,我们可以把这个数组,从2的位置进行分开,分成俩组,左边一组是2,右边一组是 1 4 9 8 5 3 ,左边一组是已经排好顺序的序列,右边一组是没有排好顺序的序列。
我们需要从右边的待排序序列中,依次拿出每一个值,和左边已经排好顺序的数字进行比较,比较的目的是为了给我们当前操作的右边数字找一个合适的位置进行插入,注意这个操作元素的位置有可能是不需要移动的,因为刚好不移动就保持了正常顺序。
举例说明:以 2 1 4 9 8 5 3 数组为例
|
2 | 1 4 9 8 5 3
|
左边:已经排好顺序的区域
右边:待排序区域
从右边依次拿出一个数据,插入到左边已经排好顺序的序列中,但是需要我们找出一个合适的为,将这个值插入。
拿到右边一个值之后,怎么在左边找出一个合适的位置?
假设当前数组是处于排序中的这个状态:
|
1 2 4 8 9 | 5 3
|
从右边拿出一个值:5
依次和左边排好序的数字比较,从大到小比:先和9比 在和8比 ..直到找到一个比当前数字5要的位置,那么我们就需要把5插入到这个位置的后面,在当前这个例子中,也就是要插入到8的位置
为了能成功的完成这个插入的操作,那么数字9就往前移动一个位置,数字也需要往前移动一个位置,移动完之后就变成这个情况了:
当前是这种情况:
|
1 2 4 8 9 | 5 3
|
9往前移动一个位置:
|
1 2 4 8 9 | 9 3
|
8往前移动一个位置:
|
1 2 4 8 8 | 9 3
|
把我们【提前保存】下来的数字5,插入到原来8的位置:
|
1 2 4 5 8 | 9 3
|
这时候我们排序区的数字就又多了一个:
|
1 2 4 5 8 9 | 3
|
1 2 4 5 8 9 | 9
1 2 4 5 8 8 | 9
1 2 4 5 5 8 | 9
1 2 3 4 5 8 | 9
package com.briup.day1;
import java.util.Arrays;
/**
*
* @author xuan
* */
public class Inserttion {
public static void main(String[] args) {
int [] arr = {10,5,6,78,21,4};//新建一个数组
for(int i=0;i<arr.length;i++) {
int changeNum = arr[i];//需要交换的数字
int changeIndex = i-1;//前一位数的下标
while(changeIndex>=0 && changeNum<arr[changeIndex]) {
//当交换的数字前一位下标大于0并且需要交换的数字小于前一位数的时候
//把前一位数挪到后一位
arr[changeIndex+1]=arr[changeIndex];
changeIndex--;//下标减一再进行交换的数字前一位的比较
}
//因为之前下标减一了,要得到交换的数字再加一即可
//例如当下标减为-1时,无法进入循环因而退出,此时把需要交换的数字换到arr[0]
arr[changeIndex+1]=changeNum;
}
System.out.println(Arrays.toString(arr));//利用Arrays的toString方法打印数组
}
}