数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

news2024/9/20 22:42:44

文章目录

    • 一、简单选择排序原理
    • 二、C/C++代码实现
    • 总结:

在这里插入图片描述


在计算机科学中,排序算法是一种非常基础且重要的算法。简单选择排序(Selection Sort)作为其中的一种,因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介绍简单选择排序的原理、实现过程,并通过C/C++代码示例来加深理解。

一、简单选择排序原理

简单选择排序的基本思想是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法步骤:

  1. 初始状态:给定待排序的序列 arr,包含 n 个元素。
  2. 第一次遍历:从第一个元素开始,依次与后面的元素比较,找到最小的元素,将其与第一个元素交换位置。
  3. 第二次遍历:从第二个元素开始,依次与后面的元素比较,找到最小的元素,将其与第二个元素交换位置。
  4. 重复步骤2和步骤3,直到倒数第二个元素和最后一个元素比较完毕。

这样经过 n-1 次遍历后,整个序列就排好序了。

算法分析:

  1. 时间复杂度:选择排序的时间复杂度为 O(n^2),其中 n 是数据元素的个数。虽然时间复杂度比较高,但是它的实现思路简单,适合于数据量较小的情况。
  2. 空间复杂度:选择排序是一种原地排序,空间复杂度为 O(1)。
  3. 稳定性:简单选择排序是一种不稳定的排序算法,即可能改变相同元素的相对顺序。

二、C/C++代码实现

以下是简单选择排序的C代码实现:

#include <stdio.h>

void selectionSort(int arr[], int n) {
    int i, j, min_index, temp;
    for (i = 0; i < n - 1; i++) {
        // 初始化最小值索引
        min_index = i;
        // 遍历未排序序列,找到最小值索引
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_index]) {
                min_index = j;
            }
        }
        // 交换最小值与未排序序列的第一个元素
        if (min_index != i) {
            temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    selectionSort(arr, n);
    printf("Sorted array: \n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

代码解析

  1. 函数selectionSort接收一个整型数组arr和数组长度n作为参数。
  2. 外层循环控制排序的趟数,共进行n-1趟排序。
  3. 内层循环寻找未排序序列中的最小值索引。
  4. 如果找到的最小值索引不是当前外层循环的起始索引,则交换这两个位置的元素。
  5. 主函数main中,定义了一个待排序的数组,调用selectionSort函数进行排序,并输出排序后的结果。

下面是用 C++ 编写的简单选择排序的示例代码:

#include <iostream>

void selectionSort(int arr[], int n) {
    int i, j, minIndex;

    for (i = 0; i < n - 1; i++) {
        // 找到未排序部分的最小元素
        minIndex = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }

        // 将最小元素与当前位置交换
        if (minIndex != i) {
            std::swap(arr[i], arr[minIndex]);
        }
    }
}

int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);

    std::cout << "Original array:" << std::endl;
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    selectionSort(arr, n);

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

    return 0;
}

解析示例代码:

  • selectionSort 函数实现了选择排序算法。外层循环控制待排序部分的起始位置,内层循环用来找到最小元素的索引。
  • std::swap 函数用于交换数组中的两个元素。
  • main 函数演示了如何使用 selectionSort 函数对数组进行排序,并输出结果。

结果:
运行上述代码,输出如下结果:

Original array:
64 25 12 22 11
Sorted array:
11 12 22 25 64

这证明了选择排序成功地将输入的数组从小到大进行了排序。

总结:

简单选择排序虽然在大数据量下效率不高,但它易于理解和实现,是理解排序算法基本思想的良好起点。在实际应用中,如果数据量较小或者对排序稳定性要求不高,选择排序可以作为一种简单有效的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装&#xff0c;配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…

华杉研发九学习日记17 正则表达式 异常

华杉研发九学习日记17 一&#xff0c;正则表达式 ^ $ 作用&#xff1a; 测试字符串内的模式(匹配) 例如&#xff0c;可以测试输入字符串&#xff0c;以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证. 替换文本&#xff08;替换》 可以使用正则表达式来…

知识工程经典语言 PROLOG基本介绍

定义 PROLOG语言是一种基于Horn子句的逻辑型程序设计语言&#xff0c;也是一种陈述性语言。 PROLOG的语句 PROLOG语言仅有三种语句&#xff0c;称为事实、规则和问题。 事实 格式 <谓词名>(<项表>). 其中谓词名是以小写英文字母开头的字母、数字、下划线等组成的…

使用js实现常见的数据结构---链表,队列,栈,树

注&#xff1a;本文只作为数据结构的实现参考和个人理解 链表 链表是由多个节点&#xff08;node&#xff09;连接起来的&#xff0c;每个节点包含了一些存储的数据和指向下一个节点的指针&#xff0c; 链表&#xff1a;多个连续的节点构成&#xff0c;节点&#xff1a;包含一…

spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j

1.简介 OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后&#xff0c;Swagger规范正式更名为OpenAPI规范&#xff0c;并且根据OpenAPI规范的版本号进行了更新。因此&#xff0c;Swagger 3.0对应的就是OpenAPI 3.0版本&#xff0c;它是Swagger在OpenAPI阶段推出的一个…

大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

试过可道云teamOS的权限管理,才知道团队协作可以这么顺

在快节奏的工作环境中&#xff0c;团队协作的顺畅与否往往决定了项目的成败。作为团队中的一员&#xff0c;我深知权限管理在团队协作中的重要性。 我们的团队在协作过程中总是被权限问题所困扰。文件共享、资料访问、任务分配……每一个环节都需要小心翼翼地处理权限设置&…

学术研讨 | 区块链与隐私计算领域专用硬件研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心主办&#xff0c;长安链开源社区支持的“区块链与隐私计算领域专用硬件研讨会”顺利召开&#xff0c;会议围绕基于区块链与隐私计算的生成式AI上链、硬件加速、软硬协同等主题展开讨论&#xff0c;来自复旦大学、清华大学、北京…

主题公园- 海豹主题式风格餐厅设计【AIGC应用】

业务背景&#xff1a;海洋馆针对细分客群增设一个打卡主题点位&#xff0c;以海豹主题式餐厅为打卡卖点&#xff0c;效果参见海豹主题式风格。 AIGC概念图制作平台&#xff1a;&#xff08;可灵&#xff09; https://klingai.kuaishou.com/ 关键词&#xff1a; 海豹主题餐厅…

机器学习 | 回归算法原理——随机梯度下降法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的多重回归继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享随机梯度下降法这一回归算法原理。本章的回归算法原理还是基于《基于广告费预测点击量》项目&#xff0c;欢迎大家交流学习&#xff01;…

Python 教程(二):语法与数据结构

目录 前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码 运算符list、set和dict 数据结构 区别1. list&#xff08;列表&#xff09;2. set&#xff08;集合&#xff09;3. dict&#xff08;字典&#xff09; 总结 前言 Python 是一种计算机编…

HarmonyOS实现跨语言交互(Node-API)

Node-API简介 通过Native接口&#xff0c;实现两种代码的交互。 是在Node.js提供的Node-API基础上扩展而来&#xff0c;但与Node.js中的Node-API不完全兼容。本质就是提供了对C/C代码的使用接口&#xff0c;使得两种代码共同工作。规范I/O、CPU密集型、OS底层等能力。 应用场景…

Python | Leetcode Python题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; class Solution:def nthUglyNumber(self, n: int) -> int:dp [0] * (n 1)dp[1] 1p2 p3 p5 1for i in range(2, n 1):num2, num3, num5 dp[p2] * 2, dp[p3] * 3, dp[p5] * 5dp[i] min(num2, num3, num5)if dp[i] num2:p2 1if …

pytest的安装和介绍和 Exit Code 含义

pytest 准备工作&#xff08;在cmd里&#xff09;&#xff1a; 1安装 pip install -U pytest2验证安装 pytest --version # 会展示当前已安装版本3其他的 显示可用的内置函数参数 pytest --fixtures通过命令行查看帮助信息及配置文件选项 pytest --help一、pytets框架中的…

Windows安装go语言开发环境

一、下载安装包 安装包下载地址 下载完毕后双击进行安装。 查看是否安装成功&#xff1a; go version #查看go版本 go env #查看go环境变量正常显示则安装完成。 二、安装vscode 一般开发go语言项目使用vscode工具&#xff1a; 下载地址 下载完毕后双击进行安装。 三…

FPGA开发——D触发器的设计

1、概述 锁存器和触发器有时组合在一起&#xff0c;因为它们都可以在其输出上存储一位&#xff08;1或0&#xff09;。与锁存器相比&#xff0c;触发器是需要时钟信号&#xff08;Clk&#xff09;的同步电路。D 触发器仅在时钟从0 到 1&#xff08;上升沿&#xff09;或 1 到 …

python—NumPy基础(3)

文章目录 算术函数算术函数的使用算术函数中out参数的使用mod()函数的使用 统计函数power()函数的使用median ()函数的使用mean ()函数的使用函数的使用 其他常用函数tile()和repeat()函数的使用roll()函数的使用resize()函数的使用replace()和put()函数的使savetxt()和loadtxt…

可视挖耳勺的正确使用方法:四款宝藏单品,等你来挑选!

现在很多人都关注自己的个护健康&#xff0c;越来越多人开始使用可视挖耳勺。传统挖耳勺很有可以清洁不干净&#xff0c;导致耳耵聍堆积在耳道深处&#xff0c;引起耳朵发炎甚至感染。可视挖耳勺可以在看见耳道内部的情况下精准挖出耳耵聍&#xff0c;一定程度上安全又有效。但…

git命令使用详细介绍

1 环境配置 设置的信息会保存在~/.gitconfig文件中 查看配置信息 git config --list git config user.name设置用户信息 git config --global user.name "有勇气的牛排" git config --global user.email “1809296387qq.com”2 获取Git仓库 2.1 本地初始化一个仓…

Apache压测工具ab(Apache Bench)工具的下载安装和使用示例

场景 Jmeter进行http接口压力测试&#xff1a; Jmeter进行http接口压力测试_接口压测两万量-CSDN博客 上面讲压测工具Jmeter的使用&#xff0c;下面介绍另外一个ab(Apache Bench)压测工具的使用。 apache bench apache bench是apache自带的压力测试工具。 ab不仅可以对ap…