数据结构自学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 次) 多(每次堆调整都有交换)

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

相关推荐
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue7 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao7 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路8 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星8 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑8 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光8 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩9 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_629494739 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表