冒泡排序
void BubbleSort(int a[],int n){
for(int i=1;i<=n-1;i++){//每趟找最大放后面,n-1趟就可以完成排序
bool flag=false;
for(int j=1;j<=n-i;j++){//每趟就从头开始放
if(a[j]>a[j+1]){//存在逆序
swap(a[j],a[j+1]);
flag=true;//有 没有序的
}
}
//每走一趟就判断是否全部有序
if(!flag) break;//如果全部有序直接break,不用再比较了
}
/*
* 冒泡排序时空复杂度分析:
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
* 稳定性:稳定(不稳定的有 快堆简向西)
* */
}
选择排序
void SelectSort(int a[],int n){
for(int i=1;i<=n-1;i++){//每趟寻找最小值的下标
int min_id=i;//每趟先假设i为最小值下标
for(int j=i+1;j<=n;j++){//那么就从i+1开始比,一直比到最末尾
if(a[min_id]>a[j]) min_id=j;
}
swap(a[min_id],a[i]);
}
/*
* 选择排序时空复杂度分析:
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
* 稳定性:不稳定的(快堆简向西中的简单选择排序)
* */
}
插入排序
void InsertSort(int a[],int n){
for(int i=2;i<=n;i++){//i为无序区第一个
int t=a[i],j;//将无序区第一个元素,即待插入元素放在临时变量t中
for(j=i-1;j>=1&&t<a[j];j--){//寻找合适插入位置
//1 3 4 5 2
a[j+1]=a[j];
}
//j+1 位置为代插入位置
a[j+1]=t;
//每次循环之后有序区++ 无序区-- 知道无序区为0 排序完成了!
}
/*
* 插入排序时空复杂度分析:
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
* 稳定性:稳定
* */
}
类冒泡排序和类选择排序
就是不完全排序,直走k趟的意思
#include <iostream>
#include <algorithm>
using namespace std;
//Topk问题(海量数据的Topk):热搜、国服排名、词条、强棒大赛
/*
* 1.直接快排O(nlogn)
* 2.类冒泡排序O(nk)
* 3.堆O(nlogk)
* 4.基于快排分治法O(n)
* */
const int N=1e5+10;
int a[N],n;
int main(){
//关闭cin cout输入输出同步,让其IO效率接近于scanf()和printf()
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int k;cin>>k;
for(int i=1;i<=k;i++){
for(int j=1;j<=n-i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
}
}
}
for(int i=n;i>=n-k+1;i--){
cout<<a[i]<<endl;
}
return 0;
}
关机输入输出同步,使得cin cout效率接近于printf scanf
//关闭cin cout输入输出同步,让其IO效率接近于scanf()和printf()
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
计数排序
不去重
#include <iostream>
using namespace std;
const int MAX=1e4;
const int N=1e5+10;
int cnt[MAX+1];
int a[N],k;
void CountSort(int a[],int n){
for(int i=1;i<=n;i++){
cnt[a[i]]++;
}
for(int i=0;i<=MAX;i++){
while(cnt[i]){
a[++k]=i;
cnt[i]--;
}
}
/*
* 计数排序:
* 时空复杂度分析:
* 时间复杂度:次数是n+MAX+n=2n+MAX -->O(n+MAX)
* 空间复杂度:O(n)
* 稳定性:~~~
* */
}
去重
遍历cnt数组的时候,把while换成if
#include <iostream>
using namespace std;
const int MAX=1e4;
const int N=1e5+10;
int cnt[MAX+1];
int a[N],k;
void CountSort(int a[],int n){
for(int i=1;i<=n;i++){
cnt[a[i]]++;
}
for(int i=0;i<=MAX;i++){
if(cnt[i]){
a[++k]=i;
}
}
}
直播获奖
暴力解法:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> a;
int n,w;cin>>n;cin>>w;
for(int i=1;i<=n;i++){
int x;cin>>x;
a.push_back(x);
sort(a.rbegin(),a.rend());
int p=max(1,i*w/100);
cout<<a[p-1]<<" ";
}
return 0;
}
计数排序思想:
#include <iostream>
using namespace std;
const int N=1e5+10,M=602;
int func(int p,int cnt[]){
//200 300 400 500 600 600 0 300 200 100
//0 100 200 300 400 500 600
//0 0 1 1 1 1 2
int cn=0;
for(int i=600;i>=0;i--){
cn+=cnt[i];
if(cn>=p) return i;
}
return 0;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int cnt[M]={0};
int n,w;cin>>n;;cin>>w;
for(int i=1;i<=n;i++){
int x;cin>>x;
cnt[x]++;
int p=max(1,i*w/100);
cout<<func(p,cnt)<<" ";
}
return 0;
}
归并排序
#include <iostream>
#include <vector>
using namespace std;
void Merge(vector<int> &a,int l,int r,int mid){
//l mid r
//1 4 5 2 3
vector<int> t;
int i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<a[j]) t.push_back(a[i++]);
else t.push_back(a[j++]);
}
while(i<=mid){
t.push_back(a[i++]);
}
while(j<=r){
t.push_back(a[j++]);
}
int id=0;
for(int k=l;k<=r;k++){
a[k]=t[id++];
}
}
void MergeSort(vector<int> &a,int l,int r){
if(l>=r) return;
int mid=(l+r)/2;
MergeSort(a,l,mid);//左分
MergeSort(a,mid+1,r);//右分
Merge(a,l,r,mid);
}
void print(vector<int> &a){
for(int i=1;i<=a.size()-1;i++){
cout<<a[i]<<" ";
}
}
int main(){
int n;cin>>n;
//5 4 3 2 1
vector<int> a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
//l m r
//5 4 3 2 1 10 9 8 7 6
MergeSort(a,1,n);
print(a);
return 0;
}