从零开始学算法(二)选择排序

选择排序

代码是Javascript语言写的(几乎是伪代码)

算法介绍

选择排序(Selection Sort),是一种简单直观的排序算法

通过每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

算法原理

记忆方法
相当于反向的冒泡排序,从0到n-1这些数里找到一个最小的放在0位置,再从1到n-1这些数里找到一个最小的放在1位置,再从2到n-1这些数中找到一个最小的放在2位置,以此类推。

官方解释
对比数列中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

可能有点抽象,详细的举个例子来说明

算法简单记忆说明

2,7,3,6,5,1
0,1,2,3,4,5 (位置)
刚开始假设第一个数字是最小的,即n=0的数字,我们用一个最小标记minIndex来标记它,即minIndex=0
随后我们开始将1-5位置的5个数开始与带有minIndex标记的数作比较,如果数字小于标记的数字,那么将标记移到这个小的数字上直到5个数全部比较完,将标记的数字和头数字进行交换,头数字每一轮向后移一个,以此类推

第一遍:(0~n-1)
2,7,3,6,5,1
0,1,2,3,4,5
7>2标记不移动
3>2标记不移动
6>2标记不移动
5>2标记不移动
1<2minIndex标记从0位置移到5位置
2,7,3,6,5,1
0,1,2,3,4,5
随后将0位置的数与minIndex上的数交换,这样得到最小的值放在首位值
1,7,3,6,5,2
0,1,2,3,4,5

第二遍:(1~n-1)
1,7,3,6,5,2
0,1,2,3,4,5
首位置最小值确定下来,我们将minIndex标记向后移一位,随后再从minIndex标记的元素后的所有元素和它作比较,重复上面的步骤
1,7,3,6,5,2
0,1,2,3,4,5
3<7minIndex标记移到2位置上
1,7,3,6,5,2
0,1,2,3,4,5
6>3标记不移动
5>3标记不移动
2<3minIndex标记移到5位置上
1,7,3,6,5,2
0,1,2,3,4,5
随后将1位置上的数与minIndex标记的数交换,找到这一轮比较中的最小值
1,2,3,6,5,7
0,1,2,3,4,5

第三遍:(2~n-1)
1,2,3,6,5,7
0,1,2,3,4,5

以此类推

最终排好序:1,2,3,5,6,7

算法复杂度和稳定性

选择排序的时间复杂度是O(N2

选择最小值的操作内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。这是一个等差数列,时间复杂度为O(N2)。

选择排序是不稳定排序算法

算法稳定性的定义: 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的。

如何理解?举个例子:
3,6,(3),1,8
第一遍:1,6,(3),3,8
我们看到2个3的顺序已经改变了

代码实现

var Selectionarr = [2,7,3,6,5,1];
function SelectionSort(arr){
	if(arr == null || arr.length<2){return;}
	for(var i=0;i<arr.length-1;i++){
	    minIndex = i;
		for(var j=i+1;j<arr.length;j++){
		minIndex = arr[j]<arr[minIndex]?j:minIndex;
		swap(arr,i,minIndex);}
	}
	return arr;
}

function swap(arr,i,j){
	arr[i] = arr[i]^arr[j];
	arr[j] = arr[i]^arr[j];
	arr[i] = arr[i]^arr[j];
}

SelectionSort(Selectionarr);
console.log(Selectionarr);

输出结果:1,2,3,5,6,7

猜你喜欢

转载自blog.csdn.net/weixin_42507756/article/details/84029752