插入排序
思路: 插入排序由N-1趟排序组成,N是数组长度。将数组分成有序和无序两个部分,将无序部分的第一个元素作为待插入元素与有序部分的元素从后往前依次比较,在有序部分找到比它小的元素,此时比它小的元素后一个位置就是待插入元素插入的位置,后面的元素后移位置即可。
第一轮排序:将数组第1个元素看成有序状态,2-N个元素是无序状态,将第2个元素(待插入元素)与第1个元素比较(第1个元素是待查入元素前一个索引位置的元素)
- 如果第2个元素小于第1个元素时,将第1个元素后移一个位置,插入索引往前移动一位。
- 否则,认为第2个元素是有序状态中最大的一个元素,将第2个元素放在当前插入索引的后一个位置上,并结束本轮的插入排序。
此时将得到前两个元素是有序状态,3-N个元素是无序状态的数组。继续进行相同的比较插入操作。
第二轮排序 : 数组1,2两个元素是有序部分,3–N个元素无序。将第3个元素作为待插入元素先与2元素比较,再与1元素比较找到合适位置插入,结果形成一个前三个元素有序,4-N个元素无序的状态。直到第N-1轮排序后得到最终结果。
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {
34,8,64,51,32,21};
insertSort(arr);
}
private static void insertSort(int[] arr){
for(int i=1;i<arr.length;i++){
int temp = arr[i]; //第i轮要插入的数
int index = i-1; //从插入的数的前一个索引位置开始比较
//当索引不越界,且要插入的值比索引值小则将索引值后移一位,索引再前移1位
while (index>=0 && temp <arr[index]){
arr[index+1]=arr[index];
index--;
}
arr[index+1]=temp;
System.out.println("第"+i+"次排序");
System.out.println(Arrays.toString(arr));
}
}
}
排序结果:
第1次排序
[8, 34, 64, 51, 32, 21]
第2次排序
[8, 34, 64, 51, 32, 21]
第3次排序
[8, 34, 51, 64, 32, 21]
第4次排序
[8, 32, 34, 51, 64, 21]
第5次排序
[8, 21