排序是计算机程序设计中的一种重要操作,它的目的就是为了将任意序列的数据元素或记录重新的按照其关键字的顺序排列成有序序列。有序序列对于数据的使用有极大的便利,在删改查中提供了方便,能够拥有更加高效的搜索效率。
定义
选择排序(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,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.
感谢你们的文章!