| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 排序算法-选择排序(C语言) -> 正文阅读 |
|
[数据结构与算法]排序算法-选择排序(C语言) |
选择排序,简单粗暴直观的排序算法。 一个长度为N的序列num[N],分为有序部分和无序部分 第一次,num[0]~num[N-1]是无序部分,从这N个数中选出最小的数,放在序列的第一个位置, 此时,num[0]是有序部分,num[1]~num[N]是无序部分 第二次,num[0]是有序部分,num[1]~num[N]是无序部分,从N-1个数中选出最小的数,放在序列的第二个位置, 此时,num[0]~num[1]是有序部分,num[2]~num[N]是无序部分 如此进行下去,整个序列最终为有序(顺序)序列 代码:
运行结果 看一下程序细节 时间复杂度 第一次需要遍历N-1个元素,第二次需要遍历N-2个元素······ 所以时间复杂度是)O(N^2) 然而,细想一下,选择排序,每一趟遍历无序部分,却只为了找到那个最小的数,效率太低(老子辛辛苦苦在无序序列兜了一圈,只找一个最小值,这哪行,哪像计算机人搜搜扣扣的精神(又扣时间又扣空间)) 于是,赶一只羊也是赶,赶两只羊也是赶。我们跑一趟无序序列,把最小值和最大值都找出来。 代码:
运行结果: ? 程序细节: ?对比单向选择排序算法,双向选择排序虽然时间复杂都仍然是O(N^2),但是效率优化了50%左右 ?填坑: 我们需要排序的序列是num[10] = {9,8,7,6,5,4,3,2,1,0} 先来看一下错误代码 ?错误细节,每一次遍历序列的变化 可以看到?,第一次遍历,最小值下标是9,最大值下标是0,处理过程是将num[min_index]放在序列开头,num[max_index]放在序列末尾,即num[0] <——>num[9],即num[0]和num[9]只需要一次换值; 但是因为执行两次swap()(换值函数),相当于原来序列并没有发生变化 在以后的遍历中,也是这种情况,所以最终结果是序列没有任何变化,也就不难理解为何代码要做如下处理 正确代码 ?正确细节,每一次遍历序列的变化 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:25:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |