冒泡排序&选择排序

本文主要介绍了冒泡排序和选择排序两种排序算法。冒泡排序操作相邻数据,可根据数组提前排好的特点优化;选择排序则是每次遍历未排序部分选最值并交换。还阐述了两种算法的时间复杂度、空间复杂度、稳定性等性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

1.思路:冒泡排序只会操作相邻的两个数据。每次冒泡排序都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩交换。

2.图解:对数组[4, 5, 6, 3, 2, 1]进行冒泡排序,每次冒泡操作的详细过程如下图所示:
image.png

从图中可以看出只需要array.length-1次冒泡,数组就可以排列好。

3.代码实现

public void bubbleSort(int[] arr) {        
   if (arr == null || arr.length < 2) return;
  
    // 需要进行arr.length - 1次冒泡
   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]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

如果数组在arr.length - 1次冒泡之前已经排列好,则不需要在进行冒泡排序。我们可以根据这个特点进行优化。

优化后的冒泡排序
public void bubbleSort(int[] arr) {
    if (arr == null || arr.length < 2) return;

    for (int i = 0; i < arr.length - 1; i++) {
    	boolean flag = true;  // 判断在一次冒泡中是否一次交换也没有发生
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                flag = false;  // 发生了交换,将flag设为false
            }
        }
       // 一次冒泡中若一次交换都没有发生,则排序已经完成,可提前结束冒泡排序
        if (flag)  return;  
    }
}

4.性质:
①时间复杂度:O(n^2)     ②空间复杂度:O(1)    
③稳定排序     ④原地排序
稳定排序:如果原数组中,a和b的值相同,a在b的前面,排序结束后a仍在b的前面,则为稳定排序。
原地排序:在排序过程中没有申请多余的空间。

选择排序

1.思路:每次遍历数组未排序部分选出最小值(最大值),与未排序部分的第一个元素交换。

2.图解:对数组[4, 5, 6, 3, 2, 1]进行选择排序,每次交换详细过程如下图所示:

image.png

3.代码实现:

public void selectSort (int[] arr) {
    if (arr == null || arr.length < 2) return;
           
    for (int i = 0; i < arr.length - 1; i++) {
        // 假定最小值的下标为i
        int min = i;   
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                // 改变最小值的下标
                min = j;   
            }
        }
        // 交换
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

4.性质:
①时间复杂度:O(n^2)     ②空间复杂度:O(1)    ③原地排序
④非稳定排序:对于数组[4,5,4,6,1],第一次遍历时,会将第一个4和最后的1交换位置,那第一个4和第二个4的顺序就改变了,所以是非稳定排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值