排序算法(一):冒泡、选择、插入的JAVA实现

排序算法(一):冒泡、选择、插入的JAVA实现

常见的8大排序算法分类如下:
在这里插入图片描述

冒泡、选择、插入属于最基本的排序算法,其时间复杂度为O(n^2)。

一、冒泡

1.1基本思路

(1)第一轮比较:以从小到大的顺序,数组第一个数据与第二个数据比较,较大值放在后面,即第二个位置
(2)接着比较数组第2个数据与第3个数据,较大值放在后面。
(3)接着比较数组第3个数据与第4个数据,较大值放在后面,依次类推。
(4)第二轮比较:同第一轮的做法,但只比较到数组倒数2、3的位置,因为数组最后一个位置已放了最大值
(5)同理进行N轮,N=数组长度-1。

1.2代码

  private void bubble(int[] arr) {
        int temp;
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;  flag=true;
                }
            }
            if (flag==false){
                break;
            }else{
                flag=false;
            }
        }
    }

上述用了标志,如果有一次冒泡没有任何的数据交换,实际上数组已经有序,可以退出。

二、简单选择

2.1基本思路

(1)以从大到小的顺序,将第一个数据与数组其他数据进行比较,最大值放在arr[0];
(2)第二个数据与其后数组其他数据进行比较,最大值放在arr[1];同理其他
(3)总共需要遍历n-1次,每次遍历从当前值下一个开始比较。

2.2代码

   private void select(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i+1; j < arr.length ; j++) {
                if (arr[i]< arr[j ]) {
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
    }

上述代码进行了所有数据的比较,实际上,可以记录最值及下标

  private void select2(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int mindex=i;  //下标
            int min=arr[i];//最值
            for (int j = i+1; j < arr.length ; j++) {
                if (min< arr[j ]) {
                    min = arr[j];
                  mindex=j;
                }
            }
            if (mindex != i) {
                arr[mindex] = arr[i];
                arr[i] = min;
            }
        }
    }

三、直接插入

3.1基本思路

(1)假设数组共N个数据,分成数组长度为1、N-1两个有序数列,每次从第二个数列中取出一个数据,取出的数据与第一个数列比较,进行插入,直到第二个数列没有数据。
(2)共需插入N-1次。

3.2代码

   public void insert(int[] arr) {
        for (int i = 1; i < arr.length; i++) {

            int value = arr[i];  //从待插入的数列取数据 ,从i=1开始
            int index = i - 1;
            while (index >= 0 && value < arr[index]) {//与第一个数列中 最后一个比,
                arr[index + 1] = arr[index];
                index--;  //满足条件后,与第一个数列中倒数第二个比,直至退出循环   
            }
            arr[index + 1] = value;
            System.out.println("di" + i);
            System.out.println(Arrays.toString(arr));
        }
    }

在这里插入图片描述
经历了四次插入,第一轮 3 9比较,第二轮 3 9(已有序) -1 比较,第三轮 -1 3 9(已有序) 10比较…
PS:学自尚硅谷的总结,打call,下同!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值