数组(二)———数组的排序算法②

目录

快速排序

基本步骤:

复杂度分析

实现示例(Java):

堆排序

基本步骤:

复杂度分析

实现示例(Java):

计数排序

基本步骤:

复杂度分析

实现示例(Java):

桶排序

基本步骤:

复杂度分析

实现示例(Java):

基数排序

基本步骤(LSD):

复杂度分析

实现示例(Java):


快速排序

定义:

快速排序是一种非常高效的排序算法,采用了分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。

基本步骤:

  1. 选择基准值:从序列中挑选一个元素作为基准值(pivot)。通常选择序列的第一个元素或者最后一个元素。
  2. 分区操作:重新排列序列中的元素,所有比基准值小的元素都移到基准前面,所有比基准值大的元素都移到基准后面。这个操作称为分区操作。分区操作完成后,基准元素会处于最终排序后的位置。
  3. 递归排序子序列:递归地对基准左边的子序列和右边的子序列重复上述过程。递归的终止条件是子序列为空或只有一个元素。

复杂度分析

时间复杂度分析:

最好情况:每次分区操作都能均匀划分序列,时间复杂度为O(n log n)。
平均情况:也是O(n log n)。
最坏情况:当输入序列已经是正序或逆序,且总是选择第一个或最后一个元素作为基准时,每次分区只将序列分成一个较大部分和一个空的部分,时间复杂度退化为O(n^2)。

空间复杂度:
快速排序是原地排序算法,但因为递归调用,所以空间复杂度主要取决于递归栈的深度,最好情况下为O(log n),最坏情况下为O(n)


稳定性:在进行哨兵划分时,基准数可能会被交换至相等元素的右侧。因此,快速排序是一种 不稳定排序算法

实现示例(Java):

以下是一个使用Java实现的快速排序示例:

/* 元素交换 */
void swap(int[] nums, int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}

/* 哨兵划分 */
int partition(int[] nums, int left, int right) {
    // 以 nums[left] 为基准数
    int i = left, j = right;
    while (i < j) {
        while (i < j && nums[j] >= nums[left])
            j--;          // 从右向左找首个小于基准数的元素
        while (i < j && nums[i] <= nums[left])
            i++;          // 从左向右找首个大于基准数的元素
        swap(nums, i, j); // 交换这两个元素
    }
    swap(nums, i, left);  // 将基准数交换至两子数组的分界线
    return i;             // 返回基准数的索引
}

堆排序

 定义:

堆排序是一种基于比较的排序算法,它利用了堆数据结构的特性来进行排序。堆排序可以分为两种主要类型:大顶堆排序和小顶堆排序。大顶堆保证每个父节点的值都大于或等于其子节点的值,而小顶堆则相反,每个父节点的值都小于或等于其子节点的值

基本步骤:

  1. 输入数组并建立大顶堆。完成后,最大元素位于堆顶。
  2. 将堆顶元素(第一个元素)与堆底元素(最后一个元素)交换。完成交换后,堆的长度减 1 ,已排序元素数量加 1 。
  3. 从堆顶元素开始,从顶到底执行堆化操作(sift down)。完成堆化后,堆的性质得到修复。
  4. 循环执行第 2. 步和第 3. 步。循环 n−1 轮后,即可完成数组排序。

复杂度分析

时间复杂度分析:

  • 时间复杂度为 O(nlog⁡n)、非自适应排序:建堆操作使用 O(n) 时间。从堆中提取最大元素的时间复杂度为 O(log⁡n) ,共循环 n−1 轮。

空间复杂度:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啵啵薯条

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

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

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

打赏作者

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

抵扣说明:

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

余额充值