冒泡排序和快速排序(java实现)

本文详细介绍了冒泡排序和快速排序两种经典的排序算法,并提供了Java实现。冒泡排序通过不断交换元素实现排序,而在初始有序或基本有序的情况下,使用change变量能减少比较次数。快速排序则以partition方法为核心,通过选择支点将序列分为两部分,并递归进行排序,平均时间复杂度优于冒泡排序。

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

冒泡排序 Bubble Sort

在基于 “交换” 进行排序的方法中,冒泡排序是比较简单的一种。

/**
 * 冒泡排序
 * 时间复杂度为O(n^2),空间复杂度为O(1)
 */
public static int[] bubbleSort(int[] array){
    boolean change = true;
    for (int i = array.length-1; i >= 1 && change; --i) {
        change = false;
        for (int j = 0; j < i; ++j) {
            if (array[j] > array[j+1]) {
                int t = array[j];
                array[j] = array[j+1];
                array[j+1] = t;
                change = true;
            }
        }
    }
    return array;
}

大部分见到的冒泡排序是没有 change 变量的。change 变量的作用是,在序列初始有序或基本有序时可以减少比较的次数,还是有存在的必要的。

快速排序 Quick Sort

快速排序是对冒泡排序的一种改进。快速排序的平均时间复杂度为O(nlog n),最坏情况下为O(n2)。所谓最坏情况,即原始顺序为逆序。

/**
 * 快速排序,是对冒泡排序的改进。
 * 平均时间复杂度为O(nlog n),最坏情况下为O(n^2)
 */
public static int partition(int []array,int low,int hight){
    int pivot = array[low];
    while(low < hight) {
        while (low < hight && array[hight] >= pivot) hight--;
        array[low] = array[hight];
        while (low < hight && array[low] <= pivot) low++;
        array[hight] = array[low];
    }
    array[low] = pivot;
    return low;
}

public static void QSort(int []array,int low,int hight) {
    if (low < hight) {
        int pivotIndex = partition(array, low, hight);
        QSort(array, low, pivotIndex-1);
        QSort(array, pivotIndex+1, hight);
    }
}

public static void quickSort(int []array) {
    QSort(array,0,array.length-1);
}

快速排序的核心思想是,经过一趟排序后将待排序列分为两个部分,其中一部分的值都要大于另一部分。然后分别将每部分再次排序,一直到整个序列有序。

partition 方法代表的是一趟排序。首先要确定一个支点 pivot ,一般可以取序列的第一个值。然后从序列的两端取值与支点比较,将大于支点的值放一端,小于的放另一端。

循环直至 low = hight ,此时序列被分为两部分,pivot 就处于当前 low/hight 的位置。返回支点的下标。

QSort 方法是递归调用 partition 方法,目的是分别对每个序列再次排序。

更多面试常见算法问题 欢迎 Star !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值