排序算法-插入排序
插入排序
插入排序法介绍:
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
插入排序法思想:
插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
插入排序思路图:
- 插入排序法应用实例:
有一群小牛, 考试成绩分别是 101, 34, 119, 1 请从小到大排序代码实现:
插入排序法应用实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | package com.xuge.sort; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; /** * author: yjx * Date :2022/5/3014:33 **/ public class InsertSort { public static void main(String[] args) { // int arr[]={101,34,98,1,-99,102}; // insertSort(arr); int arr2[]= new int [ 80000 ]; for ( int i = 0 ; i < 80000 ; i++) { arr2[i]=( int )(Math.random()* 80000000 ); //生成随机数[0,80000000); } System.out.println( "====输出数组=====" ); Date data = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); String str=sdf.format(data); System.out.println( "排序前的时间是:" +str); //23 insertSort(arr2); Date data2 = new Date(); String str2=sdf.format(data2); System.out.println( "排序后的时间是" +str2); //25 } public static void insertSort( int []arr){ for ( int i = 1 ; i < arr.length; i++) { //定义待插入数 int insertVal=arr[i]; int insertIndex=i- 1 ; //即arr[i]前面的index //给insertVal找到插入的位置 //1.insertIndex>0保证寻找插入位置不越界 //2.insertVal<arr[insertIndex]待插入的数,还没有找到插入位置 //3.即需要将arr[insertIndex]后移 //4.从大到小只需要将小于改成大于insertVal>arr[insertIndex] while (insertIndex>= 0 &&insertVal<arr[insertIndex]){ // //1.待插入数位置后移 arr[insertIndex+ 1 ]=arr[insertIndex]; //2.insertIndex-- insertIndex--; } //退出while循环时,说明插入的位置找到,insertIndex+1 //判断是否需要赋值 if (insertIndex+ 1 !=i){ //只有当前a[i]不是它该有的位置时才选择插入 arr[insertIndex+ 1 ]=insertVal; } // System.out.println("第"+i+"轮插入:"+ Arrays.toString(arr)); } /* //逐步推导 //{101,34,98,1}=>{34,101,118,1} //定义待插入数 int insertVal=arr[1]; int insertIndex=1-1;//即arr[1]前面的index //给insertVal找到插入的位置 //1.insertIndex>0保证寻找插入位置不越界 //2.insertVal<arr[insertIndex]待插入的数,还没有找到插入位置 //3.即需要将arr[insertIndex]后移 while(insertIndex>=0&&insertVal<arr[insertIndex]){// //1.待插入数位置后移 arr[insertIndex+1]=arr[insertIndex]; //2.insertIndex-- insertIndex--; } //退出while循环时,说明插入的位置找到,insertIndex+1 arr[insertIndex+1]=insertVal; System.out.println("第一轮插入:"+ Arrays.toString(arr)); //定义待插入数 insertVal=arr[2]; insertIndex=2-1;//即arr[1]前面的index //给insertVal找到插入的位置 //1.insertIndex>0保证寻找插入位置不越界 //2.insertVal<arr[insertIndex]待插入的数,还没有找到插入位置 //3.即需要将arr[insertIndex]后移 while(insertIndex>=0&&insertVal<arr[insertIndex]){// //1.待插入数位置后移 arr[insertIndex+1]=arr[insertIndex]; //2.insertIndex-- insertIndex--; } //退出while循环时,说明插入的位置找到,insertIndex+1 arr[insertIndex+1]=insertVal; System.out.println("第二轮插入:"+ Arrays.toString(arr)); //定义待插入数 insertVal=arr[3]; insertIndex=3-1;//即arr[1]前面的index //给insertVal找到插入的位置 //1.insertIndex>0保证寻找插入位置不越界 //2.insertVal<arr[insertIndex]待插入的数,还没有找到插入位置 //3.即需要将arr[insertIndex]后移 while(insertIndex>=0&&insertVal<arr[insertIndex]){// //1.待插入数位置后移 arr[insertIndex+1]=arr[insertIndex]; //2.insertIndex-- insertIndex--; } //退出while循环时,说明插入的位置找到,insertIndex+1 arr[insertIndex+1]=insertVal; System.out.println("第三轮插入:"+ Arrays.toString(arr)); */ } } |