选择排序

Java 源码解读
Java 集合类源码,JUC 源码解读
wangxiaoming

                                                                                 选择排序(从小到大排序)

                   1、 算法思想:在数组中找到一个最小的数放在最左边,然后继续在剩余数组(所以有 j = i+1c项)中找到一个最小值放在最左端,值到所有的元素排完为止

 

                   2、 实现方法:

                                   首先:在数组中找到一个最小的数放在数组的最左边

                                   其次:对剩余数组静行遍历,直到找到一个最小的数放在最左边,(这是有一重循环的)

                                   最后:把找到的那个数给最左边的那个数,直到整个数组都赋完值,这也是有一重循环的;

                 3、 复杂度分析:

                                 最坏情况

                                   比较:第一次n-1次 ,第二次n-2次。。。。。。共(n-1)n/2 次比较;

                                   交换次数:n -1次;

                                   赋值次数: 2(n-1)次;

                              可知算法复杂度为:O(n^2)

                   4、源代码:

 

               

#include<iostream>
using namespace std;
void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void ChoiceSort(int a[] , int n)
{
    int k, i, j;
    for( i = 0; i < n; i++)
    {
        k = i;                          //k的作用是标记数组中最小的一项
        for(j = i+1; j < n; j++)
        {
            if(a[k] > a[j])
            {
                k = j;                 //找到剩余数组中最小的一项
            }
        }
        if( k!=i)
        {
            swap(&a[k], &a[i]);
        }
    }
}

int main()
{
     int i;
     int a[] = {1,3,0,32,-6,9,-14};
     ChoiceSort(a,7);
     for(i = 0; i < 7; i++)
     {
          cout<<a[i]<<" ";
     }

     return 0;
}




选择排序应用:

链接:https://www.nowcoder.com/practice/a9fa482eb05149cdbad88689e3cb5f66?tpId=69&tqId=29666&rp=2&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking
来源:牛客网

题目描述

职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。 
输入描述:
输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。


输出描述:
可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。

输入例子:
5
501 Jack 6
102 Nathon 100
599 Lily 79
923 Lucy 15
814 Mickle 65

输出例子:
501 Jack 6
923 Lucy 15
814 Mickle 65


看代码:

#include<iostream>
using namespace std;

typedef struct employee{
    int id;
    char name[11];
    int age;
}employee;

int main(){
    int n;
    while(cin>>n){
        employee e[31];
        for(int i = 0; i < n; i++){
            cin>>e[i].id>>e[i].name>>e[i].age;
        }
        for(int k = 0; k < n; k++){
            // 这里就选择排序吧
            int min = k;
            for(int j = k+1; j < n; j++ ){
                if(e[min].age > e[j].age){
                    min = j;
                }else if( (e[min].age == e[j].age) &&(e[min].id > e[j].id)){
                     min = j;
                }else if((e[min].age == e[j].age) &&(e[min].id == e[j].id)&&(e[min].name >e[j].name)){
                    min = j;
                }
            }
            employee temp = e[k];
            e[k] = e[min];
            e[min] = temp;
        }
        for(int k = 0; k<3; k++)
        {
            cout<<e[k].id<<" "<<e[k].name<<" "<<e[k].age<<endl;
        }

    }

    return 0;
}




 

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值