选择排序算法研究

前言

我自己实现了很多次一些基础的算法,但不知道为什么,像选择排序和冒泡排序这一块我老是容易弄混,这里详细的研究一下。

原理

选择排序是相当于有两块内存空间,一块内存空间是存储已排序的序列,初始为空,一块空间是存储未排序的序列。我们每次就是在未排序序列里面找出目前最小的值的序列号,把他放到已排序空间的尾部,直到未排序序列为空。

实现

cpp 复制代码
#include <iostream>
using namespace std;

//算法实现部分
void simpleSelectionSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {      // 遍历每个位置
        int min_idx = i;                 // 假设当前元素是最小值
        for (int j = i+1; j < n; j++) {  // 遍历未排序部分找实际最小值
            if (arr[j] < arr[min_idx]) {
                min_idx = j;             // 更新最小值索引
            }
        }
        // 交换元素(无需判断 min_idx 是否等于 i)
        int temp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = temp;
    }
}


//测试部分
int main() {
    int data[] = {64, 25, 12, 22, 11};//数组
    int n = sizeof(data)/sizeof(data[0]);//元素个数

    simpleSelectionSort(data, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << data[i] << " ";
    }
    return 0;
}

核心逻辑

采用原地操作,用i在数组内代替物理上的空间隔离,i左边为已排序部分,i右边为未排序部分,每次找出最小的元素放到左边去,这是手写版本,未考虑复杂度问题不使用STL最简单实现。

为什么不使用物理分割?

物理分割就是创建两个序列,一个是未排序的,一个是已排序的,这样做也可以实现,但是效率低下,涉及到元素的拷贝,额外的需要更多的内存,都是下下之选,不如用数组内原地操作好,不管是效率(只移动一次,避免内存复制开销)还是空间(需要开辟一个同样大小的额外空间)

相关推荐
爱读书的小胖6 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌6 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F7 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_307779137 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
AI wins7 小时前
c++新增頭文件
c++
Shadow(⊙o⊙)7 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
tomwang03227 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!7 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by209997 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
2501_926978338 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作