排序這個東西真的挺卷的,有些就追求極致的速度,有些追求極致的簡潔,有必要學一學提一提,儘管 \(sort\) 能解決絕大部分問題。
學習筆記
氣泡排序
mpft
第一個學的排序也是最簡單的排序,也就是一個一個比較,如果右邊的數大於左邊的數就交換,我當初老師說這一個一個交換是不是就像冒泡一樣,那確實哈。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100000];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
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]<<" ";
}
return 0;
}
選擇排序
就如同他的名字一樣,每次從剩下的區間的中選擇最小的數放到區間最開始,確實挺好理解。
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000000];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int minn=10000,id=0;
for(int j=i;j<=n;j++){
if(a[j]<minn){
id=j;
minn=a[j];
}
}
swap(a[i],a[id]);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
插入排序
感覺和選擇排序有點像,每個數向前找,如果比他大就交換位置,如果小就停止判斷下一個數。
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000000];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=i;j>=1;j--){
if(a[j]<a[j-1]){
swap(a[j],a[j-1]);
}
else{
break;
}
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}