十大排序算法C++实现
七大基于选择的排序
#include<bits/stdc++.h>
using namespace std;
int a[100],n;
void bubbleSort(){
for(int i=1;i<=n-1;i++){
for(int j=1;j<n-i+1;j++){
if(a[j+1]<a[j]){
swap(a[j+1],a[j]);
}
}
}
}
void InsertSort(){
for(int i=2;i<=n;i++){
int num=a[i];
int cur=i;
while(cur>=2&&a[cur-1]>num) a[cur]=a[cur-1],cur--;
a[cur]=num;
}
}
void selectSort(){
for(int i=1;i<=n;i++){
int num=INT_MIN;
int minId=-1;
for(int j=1;j<=n-i+1;j++){
if(a[j]>num){
num=a[j];
minId=j;
}
}
swap(a[minId],a[n-i+1]);
}
}
void shellSort(){
for(int gap=n/2;gap>0;gap/=2){
for(int i=gap+1;i<=n;i+=gap){
int j=i;
int num=a[i];
while(j-gap>=1&&a[j-gap]>num) a[j]=a[j-gap],j-=gap;
a[j]=num;
}
}
}
int myPartition(int l,int r){
int id=l+1;
int num=a[l];
for(int i=l+1;i<=r;i++){
if(a[i]<num){
swap(a[i],a[id]);
id++;
}
}
swap(a[id-1],a[l]);
return id-1;
}
void quickSort(int l,int r){
if(l>=r) return ;
int pivot=myPartition(l,r);
quickSort(l,pivot-1);
quickSort(pivot+1,r);
}
void mergeSort(int l,int r){
if(l>=r) return ;
int m=(l+r)/2;
mergeSort(l,m);
mergeSort(m+1,r);
int tmp[100],tot=0;
int i=l,j=m+1;
while(i<=m&&j<=r){
if(a[i]<a[j]) tmp[++tot]=a[i++];
else tmp[++tot]=a[j++];
}
while(i<=m) tmp[++tot]=a[i++];
while(j<=r) tmp[++tot]=a[j++];
for(int i=l;i<=r;i++) a[i]=tmp[i-l+1];
}
void adjust(int root,int len){
int lchild=root*2;
int rchild=root*2+1;
int maxId=root;
if(lchild<=len&&a[lchild]>a[maxId]) maxId=lchild;
if(rchild<=len&&a[rchild]>a[maxId]) maxId=rchild;
if(maxId!=root){
swap(a[maxId],a[root]);
adjust(maxId,len);
}
}
void heapSort(){
for(int i=n/2;i>=1;i--) adjust(i,n);
for(int i=n;i>1;i--){
swap(a[1],a[i]);
adjust(1,i-1);
}
}
int main(){
freopen("in.txt", "r", stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
其他排序
#include<bits/stdc++.h>
using namespace std;
int a[100],n;
void countSort(){
int maxNum=100;
int cnt[107]={0};
for(int i=1;i<=n;i++) cnt[a[i]]++;
n=0;
for(int i=0;i<=maxNum;i++){
while(cnt[i]>0){
a[++n]=i;
cnt[i]--;
}
}
}
void bucketSort(){
int MIN=*min_element(a+1,a+1+n);
int MAX=*max_element(a+1,a+1+n);
int bucketNum=(MAX-MIN)/n+1;
vector<vector<int> > ans(bucketNum);
for(int i=1;i<=n;i++){
int num=(a[i]-MIN)/n;
ans[num].push_back(a[i]);
}
for(int i=0;i<bucketNum;i++) sort(ans[i].begin(),ans[i].end());
n=0;
for(int i=0;i<bucketNum;i++){
for(int j=0;j<ans[i].size();j++){
a[++n]=ans[i][j];
}
}
}
void radixSort(){
int maxDigit=0;
int MAX=*max_element(a+1,a+1+n);
while(MAX>0){
MAX/=10;
maxDigit++;
}
vector<int> cnt[10];
int radix=1;
for(int i=1;i<=maxDigit;i++){
for(int j=0;j<=9;j++) cnt[j].clear();
for(int j=1;j<=n;j++) cnt[a[j]/radix%10].push_back(a[j]);
n=0;
for(int j=0;j<=9;j++) for(auto val:cnt[j]) a[++n]=val;
radix*=10;
}
}
int main(){
freopen("in.txt", "r", stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
radixSort();
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n");
return 0;
}