手写基础算法01-排序算法

本文介绍如何手写实现常见的基础排序算法,包括堆排序、选择排序和插入排序。详细解析了各种排序算法的工作原理,如堆排序的上浮和下沉过程,选择排序的非稳定性,以及插入排序的稳定性。所有代码已上传至GitHub供参考,帮助读者深入理解排序算法的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

这个系列主要写常见的基础算法手写实现,代码会附在github上。

术语解释

1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。

2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。

3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。

4、非原地排序:需要利用额外的数组来辅助排序。

5、时间复杂度:一个算法执行所消耗的时间。

6、空间复杂度:运行完一个算法所需的内存大小。

堆排序 & 优先队列

堆排序和优先队列的思路是一样的:维护一个有序堆。
具体图解堆排序可以参考这个:https://www.cnblogs.com/chengxiao/p/6129630.html

堆排序维护的不是一颗树,而是一个数组。

cpp和java源代码已放在我的github上

堆排序的核心算法在于上浮和下沉过程。

上浮指的是:新加入堆的元素放到最后一个位置(即Arraylist或vector的最后一位),然后把该新加入的元素上浮到合理的位置,使之重新成为一个有序的堆。

void MyPriorityQueue::popup() {
   
    int length = MyPriorityQueue::vec.size();
    int childrenIndex = length - 1;
    while(true) {
   
        if(length == 1 || length == 0 || childrenIndex == 0)
            break;
        else {
   
            int parentIndex = (childrenIndex - 1) / 2;
            if(MyPriorityQueue::vec[parentIndex] > MyPriorityQueue::vec[childrenIndex]) {
   
                int parent_value = MyPriorityQueue::vec[parentIndex];
                int children_value = MyPriorityQueue::vec[childrenIndex];
                MyPriorityQueue::vec[parentIndex] = children_value;
                MyPriorityQueue::vec[childrenIndex] = parent_value;
                childrenIndex = parentIndex;
            } else
                break;
        <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值