C33-10.5冒泡&插入
原题链接:38471.note12025-10-05 18:48:55
发布于:江苏
一、作业讲解与提示
- 小码君摘苹果
#include<bits/stdc++.h>
using namespace std;
int a[10005],n,h,s;
int cnt = 0;
int main()
{
cin >> n >> h >> s;
h += 20;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1,a + n + 1);
for(int i = 1; i <= n; i++)
{
if(a[i] <= h)
{
s-=i;
if(s <= 0) break;
cnt++;
}
}
cout << cnt;
return 0;
}
//sort(a, a+n, cmp) //默认小到大
//sort(a, a+n, greater<int>()) //大到小
//sort(a, a+n, greater<int>()) //大到小
/*
小码君摘苹果
秋天到了,小码君家的苹果树又又又结了 n 个果子。
小码君搬了一把高为 20 cm 的椅子去摘苹果,
他目前的身高为 h cm。第 i 颗苹果到达地上的高度为 a[i],
当小码君手够不着苹果时,他会站在椅子上试试。
摘完苹果后小码君要去吃大餐,
所以他最多只有 s 秒的时间可以用于摘苹果。
小码君每摘一颗苹果,耗时都会多增加 1 秒,
即小码君第 i 次摘苹果会耗时 i 秒。
请你帮他计算 s 秒内最多能摘到的苹果数量。·
样例组
输入#1
5 150 9
172 162 149 150 170
输出#1
3
*/
- 小码君跳远

二、课堂部分
- 一次冒泡
#include <bits/stdc++.h>
using namespace std;
int n, a[1005];
int main(){
cin >> n;
for(int i=1; i<=n; i++) cin>>a[i];
for (int i=1; i<=n-1; i++){
if (a[i] > a[i+1]){
// 交换两个数a[i], a[i+1]
int t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
for (int i=1; i<=n; i++) cout<<a[i] <<' ';
return 0;
}
/*
[【基础排序(一)】一趟冒泡]
题目描述
输入 n(0<n≤100),再输入 n 个数,将这 n 个数经过一趟冒泡将最大值移到最右边。
提示
数据范围:
(0<n≤100)
题目保证所有数据均在 int 的表示范围内。
样例说明:
题目需要我们需要将大的数放在右边,首先判断6和3,交换6和3的位置,交换后为3 6 2 7 5
然后判断6和2,6大于2,交换6和2的位置,交换后为3 2 6 7 5
然后判断6和7,6小于7,不做交换
然后判断7和5,7大于5,交换7和5的位置,交换后为3 2 6 5 7
输入格式
输入有 2 行,第 1 行输入 n,第 2 行输入 n 个整数。
输出格式
输出经过一趟冒泡后的 n 个整数,数字间用一个空格隔开。
样例组
输入#1
5
6 3 2 7 5
输出#1
3 2 6 5 7
*/
- 冒泡排序
#include <bits/stdc++.h>
using namespace std;
int n, a[1005];
int main(){
cin >> n;
for(int i=1; i<=n; i++) cin>>a[i];
//1. 比较n-1趟
for (int i=1; i<=n-1; i++){
//2.每一趟的比较次数
for (int j=1; j<=n-i; j++){
if (a[j] < a[j+1]){
swap(a[j], a[j+1]);//交换函数
}
}
//输出过程
for (int i=1; i<=n; i++) cout<<a[i] <<' ';
cout<<endl;
}
return 0;
}
/*
[冒泡排序]
#if 0
输入:
5
7 6 5 3 2
原数组:7 6 5 3 2
第一轮:6 5 3 2 7 比较4次
第二轮:5 3 2 6 7 比较3次
第三轮:3 2 5 6 7 比较2次
第四轮:2 3 5 6 7 比较1次
输出
2 3 5 6 7
n个数
假设i表示趟数
轮数(趟数): n-1
每一趟比较几次 n-i
一共比较多少次:
1+2+3+4+ .... + n-1(等差数列)
#endif
这里空空如也








有帮助,赞一个