数据结构自学Day12-- 排序算法2

排序算法2

之前我们已经了解过简单的冒泡排序算法,以及插入排序,以及插入排序的优化(希尔排序) 相关内容可以参考:排序算法1。

本期内容我们将着重介绍:选择排序的思想

选择排序:

选择排序(Selection Sort) 是一种简单直观的排序算法,其基本思想是:

每一轮从待排序元素中选出最小(或最大)元素,放到已排序序列的末尾(或开头),直到全部有序。

思维导图:

代码实现:

cpp 复制代码
void Select_Sort(int* arr,int size){
    assert(arr);
    int min = 0;
    int index = 0;
    for(int i =0;i<size;i++){
        min = arr[i];
        for(int j = i;j<size;j++){
            if(arr[j]<min){
                min = arr[j];
                index = j;
            }
        }
        arr[index] = arr[0];
        arr[0] = min;
    }

}

选择排序的优化:

双向选择-->同时选择最大值和最小值进行排序。

思维导图:

代码实现:

cpp 复制代码
void Select_Sort(int* arr,int size){
    assert(arr);
    int min = 0;int max = 0;
    int index_min =0; int index_max = 0;
    for(int i = 0;i<size/2;i++)
    {
        min = arr[i];
        max = arr[size-i-1];
        index_min = i;index_max = size-i-1;
        for(int j= i;j<size-i;j++){
            if(arr[j]<min){
                min = arr[j];
                index_min = j;
            }
            if(arr[j]>max){
                max = arr[j];
                index_max = j;
            }

        }
        // 判断最大值的位置是否为所选位置
        if(index_max != size-i-1){
            arr[index_max] = arr[size-i-1]; //index_min == size-i-1
            arr[size-i-1] = max;
            //防止交换最大值时,把最小的值位置换走了
            if(index_min == size-i-1){
                index_min = index_max;
            }
        }
        if(index_min!=i){
            arr[index_min] = arr[i];
            arr[i] = min;
        }
    }
}

堆排序:

利用大根堆或者小根堆进行序列的升序或者降序排序,先建立堆,时间复杂度为堆的排序以及TopK元素问题.

阶段 说明
建堆 从 (n-2)/2 开始往前,对每个节点做 AdjustDown
排序 每次将堆顶(最大)与最后元素交换,再对前 n-1 元素做 AdjustDown
cpp 复制代码
//向下调整
void AdjustDown(int* arr,int n,int root){
    assert(arr);
    int parent = root;
    int child = 2*parent+1;
    int tmp = 0;
    while (child<n)
    {
        if(child+1<n && arr[child+1]>arr[child]){
            child++;
        }
        if(arr[child]>arr[parent]){
            tmp = arr[child];
            arr[child] = arr[parent];
            arr[parent] = tmp;
            parent = child;
            child = 2*parent+1;
        }
        else{
            break;
        }
    }
    return;
}

//堆排序 --> 升序排大根堆,降序排小根堆
void Heap_sort(int* arr,int size){
    assert(arr);
    for(int i = (size-1-1)/2;i>=0;i--){
        AdjustDown(arr,size,i);
    }
    int end = size;
    while (end>1)
    {
        int tmp = arr[0];
        arr[0] =arr[end-1];
        arr[end-1] = tmp;
        AdjustDown(arr,end-1,0);
    }

}

堆排序 vs 选择排序 对比总结

特性 选择排序 堆排序
时间复杂度 O(n²) O(n log n)
空间复杂度 O(1) O(1)
稳定性 不稳定 不稳定
实现难度 简单 略复杂
是否原地排序
适用场景 小数据量、教学演示 大数据量、工程实践
交换次数 较少(至多 n 次) 多(每次堆调整都有交换)

好了,本期的内容分享就到这里结束了,谢谢大家的点赞和收藏!

相关推荐
自信的小螺丝钉3 小时前
Leetcode 146. LRU 缓存 哈希表 + 双向链表
leetcode·缓存·散列表
机器学习之心4 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
古译汉书5 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max5006005 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
橘颂TA6 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI6 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-8 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法8 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董8 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone8 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法