插入排序(和选择排序速度差不多)

百度百科:

https://baike.baidu.com/item/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/7214992?fr=aladdin

分析图

思路在代码里补充

代码:

package com.afmobi;

import java.util.Arrays;

public class InsertSort {
	
	
	public static void main(String[] args) {
		int[] arr = {0,-1,3,-5};
		InsertSort.insertSort(arr);
	}
	
	
	public static void insertSort(int[] arr) {
		// 原始数组     0,-1,3,-5,
		
		//第1轮  结果  -1,0,3,-5,
		//定义待插入的数
		int insertVal = arr[1];
		// 待插入数 的前有个数的下标
		int insertIndex = 1 - 1; 
		
		// 给insertVal找到插入的位置
		
		while (insertIndex >= 0 //不越界
				&& insertVal < arr[insertIndex] ) { // 待插入的数还没找到位置 ,
			arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将 arr[insertIndex] 后移一位,
			insertIndex-- ; // 继续比较前面一个数,直到找到插入位置
		}
		
		//找到插入位置 insertIndex + 1; 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
		arr[insertIndex + 1 ] = insertVal;
		
		System.out.println("第一轮插入数组结果:" + Arrays.toString(arr));
		
		// 第2轮 结果 -1,0,3,-5,
		// 定义待插入的数
		insertVal = arr[2];
		// 待插入数 的前有个数的下标
		insertIndex = 2 - 1;

		// 给insertVal找到插入的位置

		while (insertIndex >= 0 // 不越界
				&& insertVal < arr[insertIndex]) { // 待插入的数还没找到位置 ,
			arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将
														// arr[insertIndex]
														// 后移一位,
			insertIndex--; // 继续比较前面一个数,直到找到插入位置
		}

		// 找到插入位置 insertIndex + 1;
		// 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
		arr[insertIndex + 1] = insertVal;

		System.out.println("第二轮插入数组结果:" + Arrays.toString(arr));
		
		
		// 第3轮 结果 -5,-1,0,3
		// 定义待插入的数
		insertVal = arr[3];
		// 待插入数 的前有个数的下标
		insertIndex = 3 - 1;

		// 给insertVal找到插入的位置

		while (insertIndex >= 0 // 不越界
				&& insertVal < arr[insertIndex]) { // 待插入的数还没找到位置 ,
			arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将
														// arr[insertIndex]
														// 后移一位,
			insertIndex--; // 继续比较前面一个数,直到找到插入位置
		}

		// 找到插入位置 insertIndex + 1;
		// 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
		arr[insertIndex + 1] = insertVal;

		System.out.println("第三轮插入数组结果:" + Arrays.toString(arr));
	}
}

测试结果:

通过每轮的测试,我们可以看出规律,也是循环操作 

代码

package com.afmobi;

import java.util.Arrays;

public class InsertSort {
	
	
	public static void main(String[] args) {
		int[] arr = {0,-1,3,-5};
		InsertSort.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];
			// 待插入数 的前有个数的下标
			int insertIndex = i - 1; 
			
			// 给insertVal找到插入的位置
			
			while (insertIndex >= 0 //不越界
					&& insertVal < arr[insertIndex] ) { // 待插入的数还没找到位置 ,
				arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将 arr[insertIndex] 后移一位,
				insertIndex-- ; // 继续比较前面一个数,直到找到插入位置
			}
			
			//找到插入位置 insertIndex + 1; 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
			arr[insertIndex + 1 ] = insertVal;
			
			System.out.printf("第%d轮插入数组结果:" ,i);
			System.out.println(Arrays.toString(arr));
			
		}
		
		
}

测试结果也是没问题的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值