【排序算法】选择排序

排序是计算机程序设计中的一种重要操作,它的目的就是为了将任意序列的数据元素或记录重新的按照其关键字的顺序排列成有序序列。有序序列对于数据的使用有极大的便利,在删改查中提供了方便,能够拥有更加高效的搜索效率。

定义

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每次找出第i小的元素(也就是A i…n中最小的元素),然后将这个元素与数组第i个位置上的元素交换。

性质

稳定性:
稳定性是指相等的元素经过排序之后相对顺序是否发生了改变。
由于swap(交换两个元素)操作的存在,选择排序是一种不稳定的排序算法。

基本思想

一次从待排序的记录中选出关键字最小的记录,顺序放在已排好序的文件的最后,直到全部记录排序完毕。n个记录的文件的直接排序可经过n-1次直接选择排序得到有序结果。

①初始状态,无序区R[0,…,n-1],有序区为空;

②第1次排序。在无序区R[0,…,n-1]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[0]交换,使有序区记录增加1个,无序区记录减少1个;

③第i次排序。在开始时,当前有序区和无序区分别为R[0,…,i]和R[i+1,…,n-1],该次排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使有序区记录增加1个,和R[i+1,…,n-1],该次排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使有序区记录增加1个。

伪代码实现:

Input. An array A consisting of n elements.
Output. A will be sorted in nondecreasing order.
Method.
for i ← 1 to n - 1
	temp ← i
		for j ← i + 1 to n
			if A[j]<A[temp]
				temp ← j
swap A[i] and A[temp]

时间复杂度

选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为O(n2)。在n值很大时,决定时间复杂度的主要是比较的次数,所以选择排序无疑是比冒泡排序快的。选择排序适用于绝大多数的场景,但是当数据量较大时,选择排序移动的次数较少,从而它具有较高的效率。

图解说明

以(5,2,7,9,1)为例。
图片1

选择排序有两个指针,比较其大小找出最小值,指针继续向后寻找与之前找到的最小值进行比较,再次找出最小值如此往复。每寻找一轮找出无序数列的最小或最大值。
图片2

图片3
图片4
图片5
图片6

找出一轮最小值后将其放入前一指针的位置交换后继续上述操作。

图片7
图片8
图片9
图片10
图片11

图片12
最终结果就为(1,2,3,7,9)。
结果图片

代码实现

以C语言实现:

void selection_sort(int* a, int n) {
  for (int i = 1; i < n; ++i) {
    int temp= i;
    for (int j = i + 1; j <= n; ++j) {
      if (a[j] < a[temp]) {
        temp = j;
      }
    }
    std::swap(a[i], a[temp]);
  }
}

以Java实现:

void selection_sort(int[ ] num){
for (int i = 0; i < num.length; i++) {
//注意minIndex的取值
 	 	int minIndex = i;
   	//j=i;意味着i之前的数都是有序的
   	for (int j = i; j < num.length; j++) {
   		if (num[j]<num[minIndex]){
   			minIndex = j;
   		}
}
   	//交换,每一次循环的i都是未排序数据的第一个
   	int temp = num[i];
   	num[i] = num[minIndex];
   	num[minIndex] = temp;
}
}

文章引用

[1]淦艳,杨有.五种排序算法的性能分析[J].重庆文理学院学报(自然科学版). 2010,29(03).
[2]翁子盛.常见排序算法及其主要应用[J].科学技术创新,2019(26):75-76.
[3]谢小玲,李山.常用排序算法的分析与比较[J].现代计算机,2020(25):71-74.

OI Wiki-选择排序
Java选择排序

感谢你们的文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值