我给师妹说算法_1 选择排序
Posted 一只前端小马甲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我给师妹说算法_1 选择排序相关的知识,希望对你有一定的参考价值。
每次看师妹对着屏幕的算法题憋得满脸通红,总觉得非常可爱,大有小拳拳锤算法胸口的意思,虽然说看师妹真的很疗愈,念在她请我喝的那么多杯喜茶的份上,我打算给师妹写点东西。每篇文章先从实际问题出发,由表及里的对特定算法做一个全方位的介绍,希望师妹在师兄毕业之后的日子也能快乐A题:)
目录
1 唠唠嗑
选择算法是一种最简单的排序算法,学习它有助于我们学习其他复杂算法。为什么叫做选择排序?顾名思义,这个排序算法的特点就是需要不断”做选择“,选择的内容就是在一堆数字中找到最值。重复这个找最值的过程n次,这堆数字有序。
2 算法思想
- 首先,找到数组中最小的元素
- 其次,将它和数组的第一个元素交换位置
- 再次,在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置
- 重复步骤3的选择过程,直到整个数组有序
ps:本文中以最终结果顺序排序为例
3 代码实现(javascript版)
算法思想是对于算法的自然语言描述,现在我们通过编程语言对选择排序算法进行实现。前面我们说过选择排序的关键在于选择,而选择的本质在于比较和交换。我们从数组第1个元素开始,不断找到0 ~ n-1、1 ~ n-1、2 ~ n-1…i ~ n-1索引对应值组成的数组的最小值,然后将其与第i个元素交换位置。
function selectSort(nums)
let min = 0;
for(let i=0; i<nums.length; i++)
// 找到最小值
min = minOfNums(nums.slice(i)) + i;
// 交换最小值
exchangeNums(nums, i, min);
return nums;
function minOfNums(nums)
function exchangeNums(nums, a, b)
3.1 如何比较
这个问题实际上是,如何在一堆数字中,通过比较找到最值,即实现minOfNums函数。
- 首先,假定第一个数是最小值,并给它一个标记
- 接着,将它和后面的数字比较,每当遇到更小的数,则将该数标记标记为最小值
- 拿新的最小值去比较,重复步骤1和2,直到数组被遍历完
function minOfNums(nums)
let min = 0;
for(let i=0; i<nums.length; i++)
if(nums[min]>nums[i])
min = i
return min;
3.2 如何交换
因为我们最初假设了一个最小值,因此我们只需要将实际最小值和假设最小值的位置交换即可。
function exchangeNums(nums, a, b)
let tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
3.3 最终版本
function selectSort(nums)
let min = 0;
for(let i=0; i<nums.length; i++)
// 找到最小值
// 此处注意,要将起始位置i加上
min = minOfNums(nums.slice(i)) + i;
// 交换最小值
exchangeNums(nums, min, i);
return nums;
// 找到规定数组的最小值
function minOfNums(nums)
let min = 0;
for(let i=0; i<nums.length; i++)
if(nums[min]>nums[i])
min = i
return min;
// 交换给定数组a,b两个位置的元素
function exchangeNums(nums, a, b)
let tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
4 复杂度分析
先给结论,选择排序的时间复杂度为O(N2),空间复杂度为O(1)
首先来看时间复杂度,选择的本质在于”比较“和”交换“
”比较“的操作对应
if(nums[min]>nums[i])
”交换“的操作对应
exchangeNums(nums, min, i);
分析可以得知
- ”比较“次数:第一次外循环的比较次数n-1 + 第二次外循环的比较次数n-2 + 第i次外循环的比较次数n-i +… + 1 = n(n-1)/2
- ”交换“次数:n
其次是空间复杂度,selectSort函数中,变量数量为常量
5 总结
本文介绍了一种最简单的排序算法——选择排序。首先,从名字入手,提出了该算法的思路;其次,指出了算法的本质在于”比较“和”交换“,并用编程语言分别实现了”比较“和”交换“过程,实现了该算法;最终,根据代码对算法的时间和空间复杂度进行分析,得出结论:选择排序的时间复杂度为O(N2),空间复杂度为O(1)。
以上是关于我给师妹说算法_1 选择排序的主要内容,如果未能解决你的问题,请参考以下文章
喜欢产品小师妹?你必须知道的一点产品知识,竞品分析:流利说雅思