插入排序,把数组从第一个元素开始,每往后一个,将后一个元素插入到前面,使得前面的是序的.
给定无序数组如下:
把数组的首元素5作为有序区,此时有序区只有这一个元素:
第一轮
让元素8和有序区的元素依次比较。
8>5,所以元素8和元素5无需交换。
此时有序区的元素增加到两个:
第二轮
让元素6和有序区的元素依次比较。
6<8,所以把元素6和元素8进行交换:
6>5,所以把元素6和元素5无需交换。
此时有序区的元素增加到三个:
第三轮
让元素3和有序区的元素依次比较。
3<8,所以把元素3和元素8进行交换:
3<6,所以把元素3和元素6进行交换:
3<5,所以把元素3和元素5进行交换:
此时有序区的元素增加到四个:
以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:
package sort.insert;
import java.util.Arrays;
/**
* @description: 插入排序
* @author:tao
* @create: 2019-12-27 17:48
*/
public class InsertSort {
public static void main(String[] args) {
int []array = {5, 8, 6, 3, 9, 2, 1, 7};
System.out.println("原数组:" + Arrays.toString(array));
insertSort(array);
System.out.println("排序数组:" + Arrays.toString(array));
}
private static void insertSort(int []array) {
int forTimes = 0;
int swapTimes = 0;
for (int i = 0; i < array.length-1; i++) {
int j = i + 1;
// 每次插入的元素
int insertValue = array[j];
boolean isSwap = false;
for ( ; j > 0 && insertValue < array[j-1]; j--) {
// (比insertValue大的值)平行移动
forTimes++;
swapTimes++;
array[j] = array[j-1];
isSwap = true;
}
if (isSwap) {
// 找到插入位置
array[j] = insertValue;
}
System.out.println("第" + i + "轮," + Arrays.toString(array) + ",插入元素是array["+ (i+1) +"]=" + insertValue + ", 插入位置是:array.index=" + j);
}
System.out.println("循环次数forTimes = " + forTimes);
System.out.println("发生交换次数swapTimes = " + swapTimes);
}
}
原数组:[5, 8, 6, 3, 9, 2, 1, 7]
第0轮,[5, 8, 6, 3, 9, 2, 1, 7],插入元素是array[1]=8, 插入位置是:array.index=1
第1轮,[5, 6, 8, 3, 9, 2, 1, 7],插入元素是array[2]=6, 插入位置是:array.index=1
第2轮,[3, 5, 6, 8, 9, 2, 1, 7],插入元素是array[3]=3, 插入位置是:array.index=0
第3轮,[3, 5, 6, 8, 9, 2, 1, 7],插入元素是array[4]=9, 插入位置是:array.index=4
第4轮,[2, 3, 5, 6, 8, 9, 1, 7],插入元素是array[5]=2, 插入位置是:array.index=0
第5轮,[1, 2, 3, 5, 6, 8, 9, 7],插入元素是array[6]=1, 插入位置是:array.index=0
第6轮,[1, 2, 3, 5, 6, 7, 8, 9],插入元素是array[7]=7, 插入位置是:array.index=5
循环次数forTimes = 17
发生交换次数swapTimes = 17
排序数组:[1, 2, 3, 5, 6, 7, 8, 9]