如何在 C 语言中进行选择排序?

C语言

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。

分割线

文章目录

  • 如何在 C 语言中进行选择排序
  • 一、选择排序的基本思想
  • 二、选择排序的算法步骤
  • 三、选择排序的 C 语言实现
  • 四、选择排序的时间复杂度和空间复杂度分析
    • (一)时间复杂度
    • (二)空间复杂度
  • 五、选择排序的稳定性
  • 六、选择排序的适用场景
  • 七、选择排序与其他排序算法的比较
    • (一)与冒泡排序的比较
    • (二)与插入排序的比较
    • (三)与快速排序的比较
  • 八、示例分析
  • 九、优化思路
    • (一)减少交换次数
    • (二)利用已排序部分的信息
  • 十、总结

分割线


如何在 C 语言中进行选择排序

选择排序(Selection Sort)是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

分割线

一、选择排序的基本思想

  1. 遍历整个数组,找出最小的元素。
  2. 将最小的元素与数组的第一个元素交换位置。
  3. 在剩余的未排序元素中重复上述步骤,直到整个数组都被排序。

分割线

二、选择排序的算法步骤

以下是选择排序的详细步骤:

假设要对数组 arr[] 进行排序,数组的长度为 n

  1. 从数组的第一个元素开始,即 i = 0
  2. 对于每个 i,从 i + 1n - 1 中找到最小的元素,并记录其索引 min_index
  3. 如果 min_index 不等于 i,则交换 arr[i]arr[min_index]
  4. 增加 i,重复步骤 2 和 3,直到 i = n - 2

分割线

三、选择排序的 C 语言实现

#include <stdio.h>

// 交换两个元素的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 选择排序函数
void selectionSort(int arr[], int n) {
    int i, j, min_index;

    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)
            swap(&arr[i], &arr[min_index]);
    }
}

// 打印数组函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

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

    printf("排序前的数组为: ");
    printArray(arr, n);

    selectionSort(arr, n);

    printf("排序后的数组为: ");
    printArray(arr, n);

    return 0;
}

在上述代码中,我们首先定义了一个 swap 函数用于交换两个元素的值。

selectionSort 函数实现了选择排序的逻辑。外层循环控制排序的轮数,内层循环用于在每一轮中找到最小的元素。

printArray 函数用于打印数组的元素。

main 函数中,我们创建了一个待排序的数组,并调用相应的函数进行排序和打印。

分割线

四、选择排序的时间复杂度和空间复杂度分析

(一)时间复杂度

选择排序的平均时间复杂度和最坏时间复杂度都为 O(n^2)。这是因为无论数组的初始状态如何,对于每个元素都需要进行比较和交换操作,总共需要进行 n - 1 轮比较和交换,每一轮比较和交换的操作数量都与数组的长度 n 成正比。

(二)空间复杂度

选择排序的空间复杂度为 O(1)。因为它只在交换元素时使用了固定的额外空间,而不需要额外的数组或其他数据结构来存储数据。

分割线

五、选择排序的稳定性

选择排序是一种不稳定的排序算法。这是因为在选择最小元素并与当前位置交换时,如果有两个相同的元素,它们的相对顺序可能会发生改变。

例如,对于数组 [5, 5', 2],第一次选择最小元素 2 并与第一个位置的 5 交换,得到 [2, 5', 5],两个 5 的相对顺序发生了变化。

分割线

六、选择排序的适用场景

选择排序适用于小型数据集或者对算法的简单性要求较高的场景。由于其时间复杂度较高,在处理大型数据集时,性能通常不如其他更高效的排序算法,如快速排序、归并排序等。

分割线

七、选择排序与其他排序算法的比较

(一)与冒泡排序的比较

选择排序和冒泡排序都是简单的排序算法,它们的时间复杂度都为 O(n^2)。然而,在每一轮的操作中,冒泡排序需要进行多次相邻元素的比较和交换,而选择排序只需要进行一次最小元素的选择和交换。因此,在通常情况下,选择排序的性能略优于冒泡排序。

(二)与插入排序的比较

插入排序在对于近乎有序的数组时,性能较好,其平均时间复杂度可以接近 O(n)。而选择排序无论数组的初始状态如何,时间复杂度都为 O(n^2)。因此,在数组近乎有序的情况下,插入排序更优。

(三)与快速排序的比较

快速排序的平均时间复杂度为 O(nlogn),是一种效率很高的排序算法。与选择排序相比,快速排序在处理大型数据集时具有明显的优势。

分割线

八、示例分析

让我们通过一个具体的示例来详细分析选择排序的过程。

假设有数组 [9, 5, 7, 2, 6]

第一轮:

  • 初始状态:[9, 5, 7, 2, 6]
  • 首先假设第一个元素 9 是最小的,然后从第二个元素开始比较。
  • 经过比较,发现 2 是最小的,所以将 29 交换位置。
  • 第一轮结束后,数组变为 [2, 5, 7, 9, 6]

第二轮:

  • 此时从第二个元素开始,假设 5 是最小的。
  • 比较剩余元素,发现没有比 5 更小的,所以位置不变。
  • 第二轮结束后,数组仍为 [2, 5, 7, 9, 6]

第三轮:

  • 从第三个元素开始,假设 7 是最小的。
  • 比较剩余元素,发现 6 更小,所以将 67 交换位置。
  • 第三轮结束后,数组变为 [2, 5, 6, 9, 7]

第四轮:

  • 从第四个元素开始,假设 9 是最小的。
  • 比较剩余元素,发现 7 更小,所以将 79 交换位置。
  • 第四轮结束后,数组变为 [2, 5, 6, 7, 9],排序完成。

通过这个示例,我们可以清晰地看到选择排序每一轮的操作过程以及如何逐步将数组排序。

分割线

九、优化思路

虽然选择排序的基本算法已经比较简单直接,但在某些情况下,仍然可以考虑一些优化思路:

(一)减少交换次数

在找到最小元素的索引后,先不立即进行交换,而是在一轮比较结束后,如果最小元素的索引与当前位置不同,再进行一次交换。这样可以在一定程度上减少交换的次数,特别是在数组中元素重复较多的情况下。

(二)利用已排序部分的信息

在后续的轮次中,可以利用已经排序好的部分,缩小搜索最小元素的范围。但这种优化在选择排序中效果可能不太显著,因为选择排序的核心思想是每次选择未排序部分的最小元素。

分割线

十、总结

选择排序是一种简单但效率相对较低的排序算法。它的优点是实现简单,易于理解,空间复杂度低。缺点是时间复杂度较高,在处理大规模数据时性能不佳。在实际应用中,应根据具体情况选择合适的排序算法。如果数据量较小,或者对算法的简单性要求较高,选择排序可以是一个可行的选择。但对于大规模数据的排序,通常会优先考虑更高效的排序算法,如快速排序、归并排序等。


分割线

🎉相关推荐

  • 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
  • 🍅博客首页-关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📙CSDN专栏-C语言修炼
  • 📙技术社区-墨松科技

分割线



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

潜在空间可视化(Latent space visualization)

在“深度学习”系列中&#xff0c;我们不会看到如何使用深度学习来解决端到端的复杂问题&#xff0c;就像我们在《A.I. Odyssey》中所做的那样。我们更愿意看看不同的技术&#xff0c;以及一些示例和应用程序。 1、引言 上次&#xff08;Autoencoders - Deep Learning bits #…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google Brain 团队开发。它用于数据流图的计算&#xff0c;尤其擅长深度学习任务。在 TensorFlow 中&#xff0c;数据流图&#xff08;Data Flow Graph&#xff09;是其核心概念之一&#xff0c;它定义了计算…

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

Retrofit框架源码深度剖析【Android热门框架分析第二弹】

Android热门框架解析&#xff0c;你确定不来看看吗&#xff1f; OkHttp框架源码深度剖析【Android热门框架分析第一弹】 Retrofit框架源码深度剖析【Android热门框架分析第二弹】 什么是Retrofit&#xff1f; 准确来说&#xff0c;Retrofit 是一个 RESTful 的 HTTP 网络请求…

雷达视频采集卡 HPx-410

产品简介 雷达视频采集卡 HPx-410&#xff0c;应用于接入导航雷达数据&#xff0c;导航雷达视频&#xff0c;适用于JRC雷达、古野furuon雷达、Sperry雷达等多种型号的雷达。 HPx-410 可以接入导航雷达数据&#xff0c;引入导航雷达原始回波&#xff0c;然后将雷达视频采集到计…

centos部署jar包

第一步&#xff1a; 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里&#xff0c;我在opt新建api目录&#xff0c;将jar文件放入&#xff0c;如下图&#xff1a; 第二步&#xff1a; 将需要读取的配置文件也放入此目录(其他目录也可以&#xff0c;和脚本中…

Python面试宝典第9题:买卖股票

题目 给定一个整型数组&#xff0c;它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易&#xff08;即买入和卖出一支股票一次&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。注意&#xff1a;你不能在买入股票前卖出股票。 示例 1&#…

设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

写在前面&#xff1a;本文是个人在学习设计模式时的所思所想&#xff0c;汇总了其他博主及自己的感悟思考&#xff0c;可能存在出入&#xff0c;请大家理性食用~~ 工厂模式 在工厂模式中&#xff0c;父类决定实例的生成方式&#xff0c;但并不决定所要生成的具体的类&#xf…

企业应对策略:全面防御.DevicData-P-xxxxxx勒索病毒

引言 在数字化时代&#xff0c;网络安全已成为不可忽视的重要议题。随着互联网的普及&#xff0c;各种网络威胁层出不穷&#xff0c;其中勒索病毒以其独特的攻击方式和巨大的破坏性&#xff0c;给个人用户和企业带来了严重的经济损失和数据安全风险。在众多勒索病毒中&#xff…

前端javascript中的排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一种原址排序法&#xff1b; 将数组分为两个区间&#xff1a;左侧为已排序区间&#xff0c;右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素&#xff0c;放到已排序区间的末尾&#xff0c;从…

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…

11、Python之变量:看得见还是看不见

引言 在前面一篇关于Python变量的文章中&#xff0c;更多地结合对象的内存结构及字节码指令&#xff0c;来看不同代码针对不同的类型的对象的不同效果。 今天这篇文章中&#xff0c;想对新手在使用Python变量中&#xff0c;可能遇到的其他困惑&#xff0c;再展开来说一下。 大…

乐器培训课程报名小程序模板源码

模板介绍 一款实用的音乐课程&#xff0c;乐器培训&#xff0c;艺术类网页课程报名手机小程序模板下载。包含&#xff1a;主页、列表、个人中心、报名等模块。 图片演示 乐器培训课程报名小程序模板源码

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…

九、C++11常用新特性—模板的优化

1.模板的右尖括号 在泛型编程种&#xff0c;模板实例化有一个非常繁琐的地方&#xff0c;那就是连续的两个右尖括号&#xff08;>>)会被编译器解析成右移操作&#xff0c;而不是模板参数表的结束&#xff0c;在C11以前需要在>>之间加上一个空格> >。C11之后…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一&#xff1a;设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一&#xff1a;设置共享文件夹步骤二&#xff1a;访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求&#xff0c;尤其是在技术行业中&#xff0c;实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…