我给师妹说算法_1 选择排序

Posted 一只前端小马甲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我给师妹说算法_1 选择排序相关的知识,希望对你有一定的参考价值。

每次看师妹对着屏幕的算法题憋得满脸通红,总觉得非常可爱,大有小拳拳锤算法胸口的意思,虽然说看师妹真的很疗愈,念在她请我喝的那么多杯喜茶的份上,我打算给师妹写点东西。每篇文章先从实际问题出发,由表及里的对特定算法做一个全方位的介绍,希望师妹在师兄毕业之后的日子也能快乐A题:)

1 唠唠嗑

选择算法是一种最简单的排序算法,学习它有助于我们学习其他复杂算法。为什么叫做选择排序?顾名思义,这个排序算法的特点就是需要不断”做选择“,选择的内容就是在一堆数字中找到最值。重复这个找最值的过程n次,这堆数字有序。

2 算法思想

  1. 首先,找到数组中最小的元素
  2. 其次,将它和数组的第一个元素交换位置
  3. 再次,在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置
  4. 重复步骤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. 接着,将它和后面的数字比较,每当遇到更小的数,则将该数标记标记为最小值
  3. 拿新的最小值去比较,重复步骤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 = 0for(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 选择排序的主要内容,如果未能解决你的问题,请参考以下文章

我给师妹说算法_2 插入排序

我给师妹说算法_2 插入排序

算法_选择排序

十大排序算法总结(Python3实现)

Java 选择排序算法

Java 选择排序算法