插入排序算法(Java实现)

本文介绍了分组插入排序的思想,通过举例和编程实现展示了如何从小到大对数组进行排序,强调了比较和交换元素的过程。
摘要由CSDN通过智能技术生成

一:基本思想

        将n个待排序的元素分成俩组,第一组为有序组,第二组为无序组,有序组里面刚开始只有第一个元素,剩下的元素都在无序组里,然后从无序组里面依次取出元素放到有序组里面进行从小到大(从大到小)排序,直到无序组里面没有数据后得到的有序组,就是我们得到的有序序列。

二:举例(从小到大排序)

数组为        int arr[] = {7,5,8,3,2,9}

 第一趟排序:

首先7假设为单独一个数组,从第二个元素5,开始遍历,5比7小

排序结果        5 7 8 3 2 9

 第二趟排序:

在前一次排序基础之上,取出下一个元素8进行比较。8比它前一个位置元素大,位置不变

排序结果        5 7 8 3 2 9

 第三趟排序:

同样在第二次排序基础上,取出下一个元素3,与8比较,较小,继续向前与7比较,还是小,继续与5比较,比5小,所以放在5的前面

排序结果        3 5 7 8 2 9

 继续如上步骤

第四趟排序结果        2 3 5 7 8 9

第五趟排序结果        2 3 5 7 8 9

图片分析

 动图分析

三:编程实现 

注意(代码关键部分): 取出某个数据与前面数据进行比较时,例如上面第三趟排序,取出数是3,3与8比较,比8小,所以3那个位置的值变成了8,这样就有了俩个8。

也就是        5 7 8 8 2 9

然后3再与8前面的7比较,7比3大,所有重复以上步骤,8原来位置的8变成了7,这样又有俩个7。

5 7 7 8 2 9

然后再依次进行,直到3遍历到5,和这个位置数字比较,3小于5,但是5前面没有数,所以原来位置的7变成了5,5这个位置被3赋值。

3 5 7 8 2 9

代码如下
import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr={7,5,8,3,2,9};
        System.out.println("原数组"+Arrays.toString(arr));
        Insert(arr);
        System.out.println("最终数组"+Arrays.toString(arr));
    }

    public static void Insert(int[] arr){

        for (int i = 1; i < arr.length; i++) {

            //从第二个数开始,取出然后和前一个数进行比较
            int insertVal=arr[i];//当前取出的数
            int insertIndex=i-1;//当前取出数的前一个索引
            //判断: 当前取出数的前一个索引大于等于0,防止越界,并且当前数小于它前面的数
            (这部分上面有详细讲解)
            while (insertIndex >= 0 && arr[insertIndex] >= insertVal){
                //因为取出数小,要往前遍历插入,所以比它大的数往后移动
                arr[insertIndex+1]=arr[insertIndex];
                //循环向前遍历数
                insertIndex--;
            }

            //判断结束后,取出数找到比它小的数,并将当前数赋值到当前比较数位置上
            //将5赋值到第一个位置
            arr[insertIndex+1]=insertVal;
            System.out.println("第"+i+"轮插入后"+Arrays.toString(arr));
        }
    }
}

结果查看
原数组[7, 5, 8, 3, 2, 9]
第1轮插入后[5, 7, 8, 3, 2, 9]
第2轮插入后[5, 7, 8, 3, 2, 9]
第3轮插入后[3, 5, 7, 8, 2, 9]
第4轮插入后[2, 3, 5, 7, 8, 9]
第5轮插入后[2, 3, 5, 7, 8, 9]
最终数组[2, 3, 5, 7, 8, 9]

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值