插入排序
思路:
把集合分成有序表与无序表,最开始有序表只有一个元素,无序表有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,1int 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+1arr[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));}}
}