问题标题: 酷町堂:多天以后,小王课堂第三课又开始了~选排

1
1
已解决
王子健
王子健
初级天翼
初级天翼

哈罗,大家好,经过数日的积淀,我小学生涯也已经结束了,虽然并不太完美,但还是有很多满足(先寒暄一下),我也有数日没有更新小王课堂了,今天为大家带来一些排序的方法,例如选择、冒泡、插入等等

--------------------------------------------------------分割------------------------------------------------------------

今天我们只讲选排,会的大佬勿进,此内容留给不会或不熟的同学,大佬勿喷简单

例题(改编自NOIP2005年普及组复赛试题):

题目描述:

输入n个数,将n个数从小到大排序

样例输入:

5

156 163 178.6 198 123

样例输出:

123 156 163 178.6 198

数据范围:

对于70%的数据:n<=1000

对于100%的数据:n<=10000

1.选择排序(10^8就会超时,选择排序平均时间是O(n^2),所以只能拿到70分)

选择排序具体思路:

 

第一次,让最矮的站在第一个人的位置上,则第一个位置的人为最矮,接下来的排序就不用管第一个人了。即n个人的排序问题转换为n-1个人的排序问题,第二次,从2~n中选最矮的站在第二个人的位置上,即n-1个人的排序问题转换为n-2个人的排序问题.......第n-1和第n个人进行比较。交换。经过n-1次交换,就形成了一个有序队列

归纳上述分析,具体实现步骤如下:

(1)读入数据

(2)在a[1]~a[n]中选择最小的,与第一个交换

(3)直到n-1与第n个元素比较排序为止

选择排序需要n*n次遍历,实现代码如下:

#include <iostream>
#include <cstdio>
const int MAXN=1010; 
using namespace std;
int n, k, i, j;
double temp, a[MAXN];
int main() {
    cin >> n;
    for(i=0; i<n; i++) {
        cin >> a[i];
    }
    for(i=0; i<n; i++) {
        k=i;
        for(j=i+1; j<n; j++) {
            if(a[k] > a[j]) k=j;
            if(k!=i) {
                temp = a[i];
                a[i] = a[k];
                a[k] = temp;
            }
        }   
    }
    for(int i=0; i<n; i++) cout << a[i] << ' ';
    return 0;
}

 

今日作业:

 

2845   函数实现选择排序(酷町堂题目),第一个给出正确答案的采纳,不需要用函数,用也可以,必须用今天讲解的方法做,此题20豆

 


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

AC惹

建议下节课更新归并排序(分治我没学过)

赵逸凡在2020-08-10 11:12:13追加了内容

@王子健 发布整段代码?

 

 

0
0
龙舟
龙舟
高级光能
高级光能

有趣的知识又增加了

ps:你觉得我的头像如何

0
黄子扬
黄子扬
初级天翼
初级天翼

勘误:选择排序需要n*n次遍历,实现代码如下:

这句话有误,我们可以说:选择排序需要O(n^2)的时间复杂度

但不能说需要n*n次遍历

 for(i=0; i<n; i++) 
        for(j=i+1; j<n; j++) 

这,想必不是n*n次吧,是n+n-1+n-2+...+1=(n^2+n)/2次吧

0
董宇昊
董宇昊
初级启示者
初级启示者

发代码被别人抄怎么办?

这是酷町堂上的题吧,弄不好还会被举报

我要回答