排序

sad_lin發表於2024-08-27

排序這個東西真的挺卷的,有些就追求極致的速度,有些追求極致的簡潔,有必要學一學提一提,儘管 \(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;
}

相關文章