冒泡排序-选择排序

冒泡排序

什么是 冒泡排序,就是让两个元素 两两比较,然后 把大的元素往后移动,把无序的排序成一个有序的 ,这么说 可能看不太懂 , 我们举个例子

假如数组中 又 { 5 , 4,3 ,2 ,1}这五个元素 

我们 先让5 和4 比较 ,谁大,就让谁交换 , 显然 5大于4,需要交换 交换后数组变成了 { 4,5,3,2,1}

然后进入第二轮  让 5 和 3 比较 谁大交换 ,直到比到1 的时候 ,数组变成了 {4,3,2,1,5}

然后 再次 从 数组索引1 也就是元素4 开始,继续新一轮的比较,直到交换了所有元素

 怎么控制 每一次新一轮的比较,显然 用 两个for循环,最内层for控制 每次的索引0 开始元素 跟所有的元素比较也就是 {5,4,3,2,1,}变成{{4,3,2,1,5}的过程,外层for控制 内层的循环比较一次之后,开启每一轮新的比较的次数 也就是又从 {4,3,2,1,5}开始再次比较

代码实现

   public static void main(String[] args) {
int []arr={9,8,7,6,5,4,3,2,1};
bubbleSortVersion1(arr);

    }
    public  static  void bubbleSortVersion1(int []arr){
        for (int j = 0; j < arr.length; j++) {
            for (int i = 0; i <arr.length-1 ; i++) {
                if(arr[i]>arr[i+1]){
                    int temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

还有一种更优雅的实现,能够减少 时间复杂度为n的2次方的次数 情况

   public static  void bubbleSortVersion2(int[] arr){
        while(true){
            int border=0;
            // 0 1 2 3  4        2 4 6 8 9 3
            for (int i = 0; i < arr.length-1; i++) {
                if(arr[i]>arr[i+1]){
                    int temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                    border=i;
                }
            }
            if (border==0){
                break;
            }
        }
        System.out.println(Arrays.toString(arr));
    }

选择排序

选择排序 顾名思义 也就是在冒泡排序的基础上排序,冒泡排序是无论是什么i情况我们都比较一次

,选择排序是 我们在每一次的内层循环中 找一个最大的元素,然后 把该最大的元素交换到数组末尾,然后 再次用外层for循环 控制次数比较

代码实现

void selectionSort(int[] arr) {
    // 外层循环控制排序的轮数
    for (int i = 0; i < arr.length - 1; i++) {
        // 假设当前位置的元素是未排序部分中最大的
        int maxIndex = i;
        // 内层循环找出未排序部分中的最大元素的索引
        for (int j = i + 1; j < arr.length; j++) {
            // 如果找到更大的元素,则更新最大元素的索引
            if (arr[j] > arr[maxIndex]) {
                maxIndex = j;
            }
        }
        // 如果最大元素不是当前轮次的起始元素,则交换它们
        if (maxIndex != i) {
            // 交换 arr[i] 和 arr[maxIndex]
            int temp = arr[i];
            arr[i] = arr[maxIndex];
            arr[maxIndex] = temp;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值