目录
一、算法思想
二、例子
1、我们有以下序列要排序
2、首先从左往右扫描,在其中找到最小的一个数,让它与第一个数互换位置
3、此次扫描完成后,我们取新的子序列,并再次从左往右扫描,在其中找到最小的一个数,让它与第一个数互换位置。
4、再次重复操作
5、此时有两个相同的元素49,我们优先选择前面的49,因为它先被扫描到
6、重复操作
三、代码实现
四、验证
五、算法性能分析
1、空间复杂度和时间复杂度
2、稳定性
六、总结
一、算法思想
每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。
二、例子
1、我们有以下序列要排序
2、首先从左往右扫描,在其中找到最小的一个数,让它与第一个数互换位置
3、此次扫描完成后,我们取新的子序列,并再次从左往右扫描,在其中找到最小的一个数,让它与第一个数互换位置。
互换前
互换后
4、再次重复操作
互换前
互换后
5、此时有两个相同的元素49,我们优先选择前面的49,因为它先被扫描到
互换前
互换后
6、重复操作
互换前
互换后
7、依此类推,我们得到最终的序列
三、代码实现
#include "bits/stdc++.h"
using namespace std;
void SelectSort(int a[],int n){
for (int i = 0; i < n-1; i++) {//从第一位遍历到倒数第二位
int min = i;//每次取子序列的首位为最小
for (int j = i+1; j < n; j++) {//从i开始遍历找到最小的数
if (a[min]>a[j]){
min = j;//得到最小数的下标
}
}
if(min != i){//为保证稳定性,让子序列的第一位和最小值交换
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
int main(){
int count,arr[10];
scanf("%d",&count);//输入数组长度
for (int i = 0; i < count; ++i) {
scanf("%d",&arr[i]);//输入数组
}
SelectSort(arr,count);//调用排序函数
for (int i = 0; i < count; ++i) {
printf("%d ",arr[i]);//输出数组
}
return 0;
}