选择排序算法的主要思想是通过逐步寻找并交换当前未排序部分的最小(或最大)元素来构建有序序列。
选择排序的详细步骤:
选择排序的时间复杂度分析:
尽管选择排序易于理解并实现,但由于其较高的时间复杂度,在处理大量数据时效率较低,不适用于对性能要求较高的场景。但在实际应用中,对于小规模数据或者特定场合(如内存非常有限),选择排序仍有一定的价值。
假设你正在整理一叠扑克牌,你想按照点数从小到大进行排列。
1.初始状态:桌上有一堆乱序的扑克牌。
2.第一步:你从这堆牌中任意拿起一张,然后查看剩下的所有牌,从中找出点数最小的那张。
假设我们都先拿未排序的第一张,然后用一个变量记录下它在的位置,注意这个变量始终会记住最小牌的下标。
用Q与后面的牌进行比较大小。
如果出现一张牌比Q小,那么将新的牌位置去替换旧牌的位置,注意这里并不是要将他们交换,而是将minIndex的值换成4的下标。
当然后续比较大小时,牌就变成了4。
我们是要找到最小数,因此对于大于4的牌都不用理会。
重复上面的过程,我们会找到最小数2。
交换以后的牌序如下图所示:
4.重复上述过程,每次都在剩余的未排序扑克牌中找出最小点数的牌并放置到已排序部分的末尾。
第二轮:在剩余未排序的七张牌中找到最小点数的牌,这里是黑桃3。
第三轮:在剩余未排序的六张牌中找到最小点数的牌,这里是黑桃4。
第四轮:在剩余未排序的五张牌中找到最小点数的牌,这里是方片5。
第五轮:在剩余未排序的四张牌中找到最小点数的牌,这里是梅花7。
第六轮:在剩余未排序的三张牌中找到最小点数的牌,这里是梅花J。
第七轮:在剩余未排序的两张牌中找到最小点数的牌,这里是红桃Q。
至此,经过七轮选择排序后,我们得到按照点数从小到大排列的扑克牌序列。
对数组的元素按从小到大进行排序。
根据分析的已知,未知按需要定义变量。
//二、数据定义
int n,a[10];
从键盘读入。
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
选择排序。
//排序1:选择
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int minIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (minIndex != i) {
swap(arr[i], arr[minIndex]);
}
}
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:n个整数的数组
//未知:更新后的数组
//关系:从小到大进行排序-冒泡排序
//二、数据定义
int n,arr[10];
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
//四、数据计算
//排序1:选择
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int minIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (minIndex != i) {
swap(arr[i], arr[minIndex]);
}
}
//五、输出结果
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
return 0;
}
输入 n 个不超过 30000 的整数(n≤10 )。然后求出每个数的数字和,再按每个数的数字和由小到大排列输出。
根据分析的已知,未知按需要定义变量。
sum:和。
//二、数据定义
int n,a[20],sum;
从键盘读入。
每个数字的数位和,因此使用短除法获得各位余数。
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum=0;
while(a[i]>0){
sum+=a[i]%10;
a[i]/=10;
}
a[i]=sum;
}
选择排序。
//四、数据计算
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int minIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (a[j] < a[minIndex]) {
minIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (minIndex != i) {
swap(a[i], a[minIndex]);
}
}
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:n个不超过30000的整数的数组
//未知:更新后的数组
//关系:从小到大排列的每个数的数位和
//二、数据定义
int n,a[20],sum;
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum=0;
while(a[i]>0){
sum+=a[i]%10;
a[i]/=10;
}
a[i]=sum;
}
//四、数据计算
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int minIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (a[j] < a[minIndex]) {
minIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (minIndex != i) {
swap(a[i], a[minIndex]);
}
}
//五、输出结果
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
给出 N (5≤N≤150 )个人的语文成绩,求 N 个人的语文总分和平均分,并按成绩高低排序后输出。
根据分析的已知,未知按需要定义变量。
//二、数据定义
int n,a[200],sum=0;
double avg=0;
从键盘读入。
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
选择排序,注意是从高到低排列。
//四、数据计算
avg=sum*1.0/n;
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int maxIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (a[j] > a[maxIndex]) {
maxIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (maxIndex != i) {
swap(a[i], a[maxIndex]);
}
}
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:N个人的语文成绩
//未知:总分sum 平均分avg 排名顺序
//关系:顺序从高到低
//二、数据定义
int n,a[200],sum=0;
double avg=0;
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
//四、数据计算
avg=sum*1.0/n;
for (int i = 0; i < n - 1; i++) { // 迭代所有元素,除了最后一个(因为最后一个是已排序部分的末尾)
int maxIndex = i; // 假设当前元素为最小值
// 寻找剩余未排序部分中的最小值索引
for (int j = i + 1; j < n; j++) {
if (a[j] > a[maxIndex]) {
maxIndex = j; // 更新找到的最小值索引
}
}
// 将找到的最小值与当前位置的元素交换
if (maxIndex != i) {
swap(a[i], a[maxIndex]);
}
}
//五、输出结果
cout<<sum<<endl;
printf("%.2f\n",avg);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
中位数指的是一组数,如果按照大小排序排好后最中间的那个数的值,如果有偶数个元素,那么就是最中间两个数的平均数!
比如:2 5 8 1 6 ,排序后的结果为 1 2 5 6 8 ,那么这组数的中位数就是 5 !
再比如: 8 9 1 2 3 0 ,排序后的结果为0 1 2 3 8 9 ,那么这组数的中位数就是 (2+3)/2=2.5 。
根据分析的已知,未知按需要定义变量。
//二、数据定义
int n,a[100];
double median;
从键盘读入。
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
想要求出一堆数中的中位数,必然先对它们进行排序。
选择排序。
//四、数据计算
for(int i=0;i<n-1;i++){
int minIndex=i;
for(int j=i+1;j<n;j++){
if(a[j]<a[minIndex]){
minIndex=j;
}
}
if(i!=minIndex){
swap(a[i], a[minIndex]);
}
}
if(n%2==0){
median=(a[n/2]+a[n/2-1])*1.0/2;
}else{
median=a[n/2]*1.0;
}
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:一组数
//未知:中位数 median
//关系:最中间的那个数的值,有偶数个元素,那么就是最中间两个数的平均数
//二、数据定义
int n,a[100];
double median;
//三、数据输入
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//四、数据计算
for(int i=0;i<n-1;i++){
int minIndex=i;
for(int j=i+1;j<n;j++){
if(a[j]<a[minIndex]){
minIndex=j;
}
}
if(i!=minIndex){
swap(a[i], a[minIndex]);
}
}
if(n%2==0){
median=(a[n/2]+a[n/2-1])*1.0/2;
}else{
median=a[n/2]*1.0;
}
//五、输出结果
printf("%.1f",median);
return 0;
}
请用选择排序。
以上就是本节关于选择排序的全部内容。
阅读量:892
点赞量:0
收藏量:0