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

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

相关推荐
梁辰兴1 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Lris-KK1 小时前
【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
sql·leetcode
野犬寒鸦1 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜1 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子2 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
一支鱼2 小时前
leetcode常用解题方案总结
前端·算法·leetcode
ulias2123 小时前
各种背包问题简述
数据结构·c++·算法·动态规划
m0_570466413 小时前
代码随想录算法训练营第二十八天 | 买卖股票的最佳实际、跳跃游戏、K次取反后最大化的数组和
java·开发语言·算法
吃着火锅x唱着歌3 小时前
LeetCode 1537.最大得分
算法·leetcode·职场和发展
数模加油站3 小时前
25高教社杯数模国赛【C题超高质量思路+可运行代码】第十弹
算法·数学建模·数模国赛·高教社杯全国大学生数学建模竞赛