常见排序算法之冒泡排序,选择排序,插入排序(Java实现)

1.冒泡排序

1.1算法思想

比较相邻的元素,对每一对相邻元素进行比较,如果第一个比第二个大,就交换他们两个。从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。第二轮针对所有的元素重复以上的步骤,除了最后一个数。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

1.2 代码实现
public static void bubbleSort(int[] arr){
        // 冒泡排序,主要思想是进行n趟遍历,每次将最大值放在最后或将最小值冒在最前面,即需要两两比较
        // 两层for循环,外层是要遍历的趟数,内层是每趟遍历的长度
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr.length - 1 - i; j++){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                }
            }
        }
    }

2. 插入排序

2.1 算法思想

从第二个数开始,往前面已经排好序的子数组进行插入,两层for循环,外层是第二个数到最后一个数,内层是往前插入时需要移动的数字个数

2.2 代码实现
public static void insertSort(int[] arr){
           // 从第二个数开始,往前面已经排好序的插入
           /*for(int i = 0; i < arr.length - 1; i++){
               for(int j = i + 1; j > 0 && arr[j] < arr[j - 1]; j--){
                   swap(arr,j,j - 1);
               }
           }*/

           for(int i = 1; i < arr.length; i++){
               for(int j = i; j > 0 && arr[j] < arr[j - 1]; j--){
                   swap(arr,j,j-1);
               }
           }
    }

3.选择排序

3.1 算法思想

进行n趟选择(其实n-1趟就可以了),每一趟都将当前趟(即除掉上一趟已经放在正确位置的数)的最大值或最小值放到最后面或最前面,两层for循环,外层确定趟数,内层确定要比较的次数,第一次需要n-1,最后一次需要1次

3.2 代码实现
    public static void selectSort(int[] arr){
        // 主要思想是,每次选择出最大或最小的元素
        // 两层for循环,外层循环定好要选择对应元素的下标,内层选出对应次序最大或最小值的下标
        for(int i = 0; i < arr.length; i++){
            int min = i;
            for(int j = i + 1; j < arr.length; j++){
                /*if(arr[min] > arr[j]){
                    min = j;
                }*/
                min = arr[min] > arr[j] ? j : min;
            }

            swap(arr, i, min);
        }
    }

4.swap函数实现

上面的swap函数Java里没有为我们提供,我们需要自己实现

public static void swap(int[] arr,int i,int j){
        if (i == j) {
            return;
        }
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

关于实现原理,在百度上看到了一个解释的不错的:a=a^b解释
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值