插入排序
思路:
把集合分成有序表与无序表,最开始有序表只有一个元素,无序表有n-1个元素,排序过程中每次取出无序表的第一个元素,然后与有序表中的元素比较,插入到适当位置
小结:
1.一共要进行n-1次排序循环
排序过程
排序前---
[101, 34, 119, 1]
第1轮插入后---
[34, 101, 119, 1]
第2轮插入后---
[34, 101, 119, 1]
第3轮插入后---
[1, 34, 101, 119]
代码实现:
public class InsertSort {
public static void main(String[] args) {
int arr[] = {101, 34, 119, 1};
System.out.println("排序前---");
System.out.println(Arrays.toString(arr));
insertSort(arr);
}
public static void insertSort(int[] arr) {
//因为无序集合的第一个数是arr[1]
for (int i = 1; i < arr.length; i++) {
//第一轮 34,101,119,1
int insertVal = arr[i];//待插入的数(针对无序集合),是无序集合中的第一个arr[1],arr[0]是有序集合的第一个
int insertIndex = i-1;//insertval的下标前一个数,要插入的位置
//insetVal找到要插入的位置
//insertIndex >= 0保证其不要越界
//insertVal<arr[insertIndex]待插入的数还没有找到插入位置,arr[insertIndex]还得向后移
//要插入的数得小于要插入下标位置的数
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
//arr[insertIndex]向后移
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//判断是否需要赋值
if (insertIndex+1!=i){
//当退出while()时说明,要插入的位置找到:insertIndex+1
arr[insertIndex+1]=insertVal;
}
System.out.println("第"+i+"轮插入后---");
System.out.println(Arrays.toString(arr));
}
}
}
无注释版:
public class TestSort {
public static void main(String[] args) {
int arr[] = {101, 34, 119, 1};
System.out.println("排序前---");
System.out.println(Arrays.toString(arr));
insertSort(arr);
}
public static void insertSort(int[] arr) {
for (int i = 1; i <arr.length ; i++) {
int value=arr[i];
int index=i-1;
while (index>=0&&value<arr[index]){
arr[index+1]=arr[index];
index--;
}
if (index+1!=i){
arr[index+1]=value;
}
System.out.println("第"+i+"轮插入后---");
System.out.println(Arrays.toString(arr));
}
}
}