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

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

相关推荐
alphaTao4 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1125 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余14 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI情绪识别开源14 小时前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
罗西的思考15 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha601616 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘17 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天19 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源20 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶20 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法