排序(啊哈!算法)

一.桶排序

 

 

 

#include<iostream>
using namespace std;
int a[1001];
int b[10];
int main(){
	int count=1;
	for(int i=0;i<10;i++){
		cin>>b[i];
		a[b[i]]+=1;
	}
	
	for(int i=1000;i>=0;i--){
		if(a[i]){
			for(int j=0;j<a[i];j++){
				if(count!=10){
				cout<<i<<' ';
				}else{
				cout<<i<<endl; 
				}
				count++;
			}
		}
	}
	return 0;
	//时间复杂度O(10+1000+10) 
	//忽略较小的常数随意时间复杂度为O(1000) 
} 

 

二.冒泡排序

 

 

N个数需要N-1趟,每趟比较N-i次(i是趟数)

#include<iostream>
using namespace std;
int a[10];
int main(){
	int temp=0;
	for(int i=0;i<10;i++){
		cin>>a[i];
	}
	for(int i=0;i<10-1;i++){
		for(int j=0;j<10-i;j++){
			if(a[j]<a[j+1]){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				
			}
		}
	}
	for(int i=0;i<10;i++){
		if(i!=9){
			cout<<a[i]<<' ';
		}else{
			cout<<a[i]<<endl;
		} 
	}
	return 0;
} 

 例子:

输出姓名成绩,按成绩进行排序,解决了桶排序遗留问题

#include<iostream>
using namespace std;
struct student{
    char name[21];
    int score;
};
struct student a[100];
int n;
int main(){ 
    int temp=0;
    cin>>n;
    cout<<endl;
    for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].score;
    }
    for(int i=1;i<=n-1;i++){
        for(int j=1;j<=n-i;j++){
            if(a[j].score<a[j+1].score){
                temp=a[j+1].score;
                a[j+1].score=a[j].score;
                a[j].score=temp;
            }
        }
    }
     cout<<endl; 
    for(int i=1;i<=n;i++){
        cout<<a[i].name<<':'<<a[i].score<<endl; 
    }
    return 0;
}

3.快速排序

 

 

 

 

 

 

 

 

 

#include<iostream>
using namespace std;
int a[100];
int n;
void quicksort(int i,int j){
    if(i>j){
        return;
    }
    int temp=a[i];
    int left=i;
    int right=j;
    while(i != j){
        while(a[j]>=temp && i<j){
            j--;
        }
        while(a[i]<=temp && i<j){
            i++;
        }
        int k=a[i];
        a[i]=a[j];
        a[j]=k;    
    }
    int k=a[left];
    a[left]=a[i];
    a[i]=k;

    quicksort(1,i-1);
    quicksort(i+1,right);
    
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    quicksort(1,n);
    for(int i=1;i<=n;i++){
        if(i!=n){
            cout<<a[i]<<' ';
        }else{
            cout<<a[i]<<endl;
        }
    }
    return 0;
} 

 例题:输入N个数,对其”去重“然后排序

#include<iostream>
using namespace std;
int a[100];
int n;
void quicksort(int i,int j){
    int temp=a[i];
    int left=i;
    int right=j;
    if(i>j){
        return;
    }
    while(i<j){
        while(a[j]>=temp && i<j){
            j--;
        }
        while(a[i]<=temp && i<j){
            i++;
        }
        int k=a[i];
        a[i]=a[j];
        a[j]=k;
    }
    int k=a[left];
    a[left]=a[i];
    a[i]=k;
    quicksort(left,i-1);
    quicksort(i+1,right);
    
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    quicksort(1,n);
    for(int i=1;i<=n;i++){
        if(a[i] != a[i-1]){
            if(i!=n){
                cout<<a[i]<<' ';
            }else{
                cout<<a[i]<<endl;
            }
        }
    }
    return 0;
}

 

 

posted on 2020-03-24 12:20  二进制dd  阅读(167)  评论(0编辑  收藏  举报

导航