插入排序【Java实现】

    技术2022-07-16  66

    插入排序法介绍:

    插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

    插入排序法思想:

    插入排序(InsertionSorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表

    插入排序思路图:

    插入排序的过程演示

    @Test public void test(){ //插入排序的过程演示 int arr[] = new int[]{101,34,119,1}; //第一轮:{101,34,119,1} => {34,101,119,1} //定义待插入的数 int insertVal = arr[1]; int insertIndex = 1-1; //即arr[1]的前面这个数的下标 //给insertVal找到插入的位置 //说明 //1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界 //2.insertVal < arr[insertIndex] 待插入的数,还没有找到插入的位置 //3.就需要将arr[insertIndex] 后移 while (insertIndex >= 0 && insertVal < arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } //当退出while循环时,说明插入的位置找到 indexIndex + 1 arr[insertIndex + 1] = insertVal; System.out.println("第1轮插入:"+ Arrays.toString(arr)); //第二轮 //定义待插入的数 insertVal = arr[2]; insertIndex = 2-1; while (insertIndex >= 0 && insertVal < arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } arr[insertIndex + 1] = insertVal; System.out.println("第2轮插入:"+ Arrays.toString(arr)); //第三轮 //第二轮 //定义待插入的数 insertVal = arr[3]; insertIndex = 3-1; while (insertIndex >= 0 && insertVal < arr[insertIndex]){ arr[insertIndex+1] = arr[insertIndex]; insertIndex--; } arr[insertIndex + 1] = insertVal; System.out.println("第3轮插入:"+ Arrays.toString(arr)); }

    插入排序

    方式一:

    public static void main(String[] args) { int arr[] = new int[]{20, 50, 30, 10, 40}; insertSort(arr); } public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int insertVal = arr[i]; int insertIndex = i - 1; //即arr[1]的前面这个数的下标 //给insertVal找到插入的位置 //说明 //1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界 //2.insertVal < arr[insertIndex] 待插入的数,还没有找到插入的位置 //3.就需要将arr[insertIndex] 后移 while (insertIndex >= 0 && insertVal < arr[insertIndex]) { arr[insertIndex + 1] = arr[insertIndex]; insertIndex--; } //当退出while循环时,说明插入的位置找到 indexIndex + 1 arr[insertIndex + 1] = insertVal; System.out.println("第" + i + "轮插入:" + Arrays.toString(arr)); } }

    方式二:

    for (int i = 1; i < arr.length; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { arr[j] = arr[j] ^ arr[j - 1]; arr[j - 1] = arr[j] ^ arr[j - 1]; arr[j] = arr[j] ^ arr[j - 1]; } else { break; } } System.out.println("第" + i + "轮:" + Arrays.toString(arr)); }

    把 if 的条件放进 while 内:

    for (int i = 1; i < arr.length; i++) { for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) { arr[j] = arr[j] ^ arr[j - 1]; arr[j - 1] = arr[j] ^ arr[j - 1]; arr[j] = arr[j] ^ arr[j - 1]; } System.out.println("第" + i + "轮:" + Arrays.toString(arr)); }

    方式三:

    for (int i = 1; i < arr.length; i++) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { arr[j] = arr[j] ^ arr[j + 1]; arr[j + 1] = arr[j] ^ arr[j + 1]; arr[j] = arr[j] ^ arr[j + 1]; } System.out.println("第" + i + "轮:" + Arrays.toString(arr)); }
    Processed: 0.023, SQL: 9