初级天翼
哈罗,大家好,经过数日的积淀,我小学生涯也已经结束了,虽然并不太完美,但还是有很多满足(先寒暄一下),我也有数日没有更新小王课堂了,今天为大家带来一些排序的方法,例如选择、冒泡、插入等等
--------------------------------------------------------分割------------------------------------------------------------
今天我们只讲选排,会的大佬勿进,此内容留给不会或不熟的同学,大佬勿喷简单
例题(改编自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豆
初级启示者
AC惹
建议下节课更新归并排序(分治我没学过)
赵逸凡在2020-08-10 11:12:13追加了内容
@王子健 发布整段代码?
初级天翼
勘误:选择排序需要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次吧