选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法
n
个记录的直接选择排序可经过
n-1
趟直接选择排序得到有序结果。
- 初始状态:无序区为R[1..n],有序区为空;
- 第i趟排序 (i=1,2,3…n-1) 开始时,当 1个记录R交换,使 R[1..i] 和 R[i+1..n) 分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
C++代码实现:
#include<iostream>
const int N = 110;
int arr[N];
void selection_sort(int arr[],int l,int r){
int len =r - l + 1;
int min_idx;
for (int i = 0; i < len - 1; i++)
{
min_idx = i; //先让最小的idx等于i
/* code */
for (int j = i + 1; j < len; j++) // 如果找到比i更小的数,更新min_idx
{
if (arr[j] < arr[min_idx]) min_idx = j;
/* code */
}
std::swap(arr[i],arr[min_idx]);//交换位置
}
}
int main()
{
//首行输入一个数字n(代表要排序的个数)
//次行输入n个数(代表要排序的数字)
int n;
system("chcp 65001");
std::cout << "输入排序的数字个数:"<< std::endl;
std::cin >> n;
std::cout << "输入排序的数字"<<std::endl;
for (int i = 0; i < n; i++) std::cin >> arr[i];
selection_sort(arr,0,n-1);
for (int i = 0; i < n; i++) std::cout << arr[i] << " ";
}
运行结果:
Active code page: 65001
输入排序的数字个数:
5
输入排序的数字
3 2 12 34 32
2 3 12 32 34
Python代码实现:
def selection_sort(num:list[int]) ->None:
#设置要几轮循环才可以排序完成
for i in range(0,len(num) - 1):
#默认认为最小的是没排序的第一个数据
min_index = i
#找到最小数据的索引位置
for j in range(i + 1,len(num)):
if num[j] < num[min_index]:
min_index = j
#交换索引位置上的数据
num[i],num[min_index] = num[min_index],num[i]
if __name__ == '__main__':
num = list(map(int,input().split()))
selection_sort(num)
print(num)
运行结果:
3 4 2 13 34
[2, 3, 4, 13, 34]
时间复杂度:
O(n^2)
空间复杂度:
O(1)