第16讲- 插入排序

A-L1-2-第16讲- 插入排序

5393 n个数降序排序

描述

输入n个整数,使用插入排序,将n个数降序排序并输出。

输入描述

第一行,一个整数n(1≤n≤100);

第二行,n个整数,每个整数的范围1~1000,存入数组a中。

输出描述

一行n个整数,从大到小(降序)排列,使用空格隔开。

样例输入 1

复制代码
5
10 137 568 326 754

样例输出 1

复制代码
754 568 326 137 10
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
	int a[100]={0};
	int n;
	cin>>n;
	int x;
	for(int i=0;i<n;i++){
		cin>>x;
		int j;
		for(j=i-1;j>=0;j--){
			if(a[j]<x){
				a[j+1]=a[j];
			}
			else break;
		}
		a[j+1]=x;
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<' ';
	}
	return 0;
} 

3810 奇数递增序列

描述

给定一个长度为 N(不大于 500 )的正整数序列,请将其中的所有奇数取出,并按升序输出。

输入描述

第 1 行为 N。

第 2 行为 N 个正整数,其间用空格间隔,数据保证至少有一个奇数。

输出描述

升序输出的奇数序列,数据之间用空格隔开。

样例输入 1

复制代码
10
1 3 2 6 5 4 9 8 7 10

样例输出 1

复制代码
1 3 5 7 9

提示

数据范围与提示

不大于 500

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[505],b[505],x,c;
int main() {
    cin>>c;
    for(int i=0;i<c;i++){
        cin>>a[i];
        if(a[i]%2==1){
            b[x]=a[i];
            x++;
        }
    }
    for(int i=0;i<x;i++){
        int z=b[i];
        int j;
        for(j=i-1;j>=0;j--){
            if(b[j]>z){
                b[j+1]=b[j];
            }
            else{
                break;
            }
        }
        b[j+1]=z;
    }
    for(int y=0;y<x;y++){
        cout<<b[y]<<" ";
    }
    
    
    
    
    
	return 0;
}

2675 书架

描述

Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座"奶牛塔"。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。

所有 N(1≤N≤20000) 头奶牛都有一个确定的身高Hi(1≤Hi ≤10000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1≤B≤S<2,000,000,000。

显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入描述

第 1 行是两个用空格隔开的整数:N 和 B;

接下来N行是N个奶牛的身高。

输出描述

输出一个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部。

样例输入 1

复制代码
6 40
6
18
11
13
19
11

样例输出 1

复制代码
3
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,b,j,x,num;
int a[20005];
int main(){
	cin>>n>>b;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		
		int x=a[i];
		for(j=i-1;j>=0;j--){
			if(x>a[j])
				a[j+1]=a[j];
			else break;
		}
		a[j+1]=x;
	}
	int h=0,cnt=0;
	while(h<b){
		h+=a[cnt];
		cnt++;
	}
	cout<<cnt;
	return 0;
}

2674 逆序对

描述

最近,小童了解到一个叫"逆序对"的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中的一对整数(ai,aj),满足ai>aj且i<j。

知道这概念后,小童就想算一算给定的一段正整数序列中逆序对的数目。注意序列中可能有重复数字。

输入描述

第1行,一个数n,表示序列中有n个数。(n<=2500)

第2行,n个数,表示给定的序列。序列中每个数字不超过109。

输出描述

输出序列中逆序对的数目。

样例输入 1

复制代码
6
1 2 3 3 5 6

样例输出 1

复制代码
0

样例输入 2

复制代码
5
5 1 1 0 4

样例输出 2

复制代码
6
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a[2500];
	cin >> n;
	for(int i=0; i<n; i++)
		cin >> a[i];
	//用于存储交换次数
	int cnt = 0; 
	for(int i=0;i<n;i++){
		int x=a[i];
		int j;
		for(j=i-1;j>=0;j--){
			if(a[j]>x){
				a[j+1]=a[j];
				cnt++;//累计交换次数
			}else break;
		}
		a[j+1]=x;
	}
// 选择不稳定,所以不能实现
//	for(int i=0;i<n-1;i++){
//		for(int j=i+1;j<n;j++){
//			if(a[i]>a[j]){
//				int tmp = a[i];
//				a[i]=a[j];
//				a[j]=tmp;
//				cnt++;//累计交换次数
//			}else break;
//		}
//	}
	cout << cnt;
	return 0;
}
相关推荐
VincentStory26 分钟前
分享一个项目中遇到的一个算法题
android·算法
ylfhpy3 小时前
Java面试黄金宝典1
java·开发语言·算法·面试·职场和发展
这个懒人3 小时前
SB重删算法详解:原理、架构与实现
c++·算法·哈希算法
Cachel wood4 小时前
Mysql相关知识:存储引擎、sql执行流程、索引失效
android·人工智能·sql·mysql·算法·前端框架·ab测试
wen__xvn4 小时前
每日一题洛谷P1106 删数问题c++
开发语言·c++·算法
_GR4 小时前
2020年蓝桥杯第十一届C&C++大学B组(第二次)真题及代码
c语言·数据结构·c++·算法·蓝桥杯
SomeB1oody4 小时前
【Python机器学习】3.2. 决策树理论(进阶):ID3算法、信息熵原理、信息增益
python·算法·决策树·机器学习
维齐洛波奇特利(male)5 小时前
(暴力枚举 水题 长度为3的不同回文子序列)leetcode 1930
算法·leetcode·职场和发展
每次的天空5 小时前
Android第四次面试总结(基础算法篇)
android·算法·面试
知舟不叙5 小时前
机器学习——深入浅出理解朴素贝叶斯算法
人工智能·python·算法·机器学习