目录
插入排序
插入排序的基本思想:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它插入到有序表中的适当位置。
插入适当位置的方法
插入值找到比自己更小的数,然后插入到右边
无序表的第一个数和有序表的最后一个数比较,如果小则和之前一个比较
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1};
insertSort(arr);
}
public static void insertSort(int[] arr){
for(int i=1; i < arr.length; i++){
int insertVal = arr[i]; //代表无序表的第一个数
int insertIndex = i-1; //代表有序表的最后一个数
//insertIndex >=0 保证在给insertVal 找插入位置,不越界
//插入值找到比自己更小的数,然后插入到右边
//无序表的第一个数和有序表的最后一个数比较,如果小则和之前一个比较
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex]; //有序表中的数往后移
insertIndex--;
}
//找到插入位置
arr[insertIndex + 1] = insertVal;
System.out.println("第"+i+"次插入");
System.out.println(Arrays.toString(arr));
}
}
}
运行结果:
优化版本
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1};
insertSort(arr);
}
public static void insertSort(int[] arr){
int insertVal = 0;
int insertIndex = 0;
for(int i=1; i < arr.length; i++){
insertVal = arr[i]; //代表无序表的第一个数
insertIndex = i-1; //代表有序表的最后一个数
//insertIndex >=0 保证在给insertVal 找插入位置,不越界
//插入值找到比自己更小的数,然后插入到右边
//无序表的第一个数和有序表的最后一个数比较,如果小则和之前一个比较
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex]; //有序表中的数往后移
insertIndex--;
}
//找到插入位置
//判断是否需要赋值
if(insertIndex + 1 !=i){
arr[insertIndex + 1] = insertVal;
}
System.out.println("第"+i+"次插入");
System.out.println(Arrays.toString(arr));
}
}
}
插入排序问题
问题:如果需要插入的数是较小的数时,后移的次数明显增多,效率会受到影响。