当前位置:编程学习 > C/C++ >>

排序

 
[cpp]  
/* 
 
排序基础:冒泡,起泡...  
注意加等号的意义何在...  
 
*/  
#include<iostream>  
#include<cstdio>  
using namespace std;  
#define manx 5000  
  
int x[manx];  
  
void sort(int n){  //// 冒泡   
    for(int i=0;i<n;i++)  
        for(int j=1;j<n-i;j++)  
            if(x[j-1]>=x[j]) swap(x[j-1],x[j]);  //////加等号   
}  
  
void sort1(int n){  /// 起泡   
    for(int i=0;i<n;i++)  
        for(int j=n-1;j>i;j--)  
            if(x[j-1]>=x[j]) swap(x[j-1],x[j]);  //////加等号   
}  
  
int main(){  
    int n;  
    while(cin>>n){  
        for(int i=0;i<n;i++)  
             scanf("%d",&x[i]);  
        sort1(n);  
        for(int i=0;i<n;i++)  
            printf("%d ",x[i]);  
        printf("\n");  
    }  
}  
  
[cpp]  
/* 
 
选择排序:时间复杂度 n^2 ..注意模型,把模型翻译成代码,OK, 
每次从 i+1 ~ n 中找出最小的值与 i 交换  
 
*/   
#include<iostream>  
#include<cstdio>  
using namespace std;  
#define manx 5000   
int x[manx];  
  
void sort(int n){  
    for(int i=1;i<n;i++){  
        int temp = x[i];  
        int ans = i;  //// 记录位置   
        for(int j=i+1;j<=n;j++){  
            if(x[j]<temp) {  
                temp = x[j];  
                ans = j;  
            }      
        }  
        if(ans!=i) swap(x[i],x[ans]);  
    }   
}  
  
int main(){  
    int n;  
    while(cin>>n){  
        for(int i=1;i<=n;i++) scanf("%d",&x[i]);  
        sort(n);  
        for(int i=1;i<=n;i++)  
            printf("%d ",x[i]);  
        printf("\n");  
    }      
}  
 
[cpp]  
 /* 
 
归并排序:我的程序有些缺陷,实现的时间复杂度是 2n*lgn(待优化) .. 
开的数组可以使用动态开辟,从而节省空间..  
所以其他的也没什么的,不用写的很复杂...  
 
*/   
#include<iostream>  
#include<cmath>  
using namespace std;  
#define manx 1000009  
int x[manx];  
  
void sort(int st,int ed){  
    if(st==ed) return ;  
    int mid=(st+ed)>>1;  
    sort(st,mid);  
    sort(mid+1,ed);  
    int flag = st;  
    int *z = new int[manx];  
    for(int i=st,j=mid+1; i<=mid || j<=ed;  ){  /////////  
        if( i>mid ) {  /////////  
            z[flag++] = x[j];  
            j++;  
            continue;  
        }   
        if( j>ed ) {   //////////  
            z[flag++] = x[i];  
            i++;  
            continue;  
        }  
        if(x[i]<=x[j]){  //// 注意等号的意义...   
            z[flag++] = x[i];  
            i++;  
            continue;  
        }  
        if(x[i]>x[j]){  
            z[flag++] = x[j];  
            j++;  
            continue;  
        }  
    }  
    for(int i=st;i<=ed;i++) x[i]=z[i];  ////蛋疼..这里花多了一倍的时间..待优化   
    delete []z;  
    return ;   
}  
  
int main(){  
    int n;  
    while(cin>>n){  
        for(int i=1;i<=n;i++)  
            scanf("%d",&x[i]);  
        sort(1,n);  
        for(int i=1;i<=n;i++)  
            cout<<x[i]<<" ";  
        cout<<endl;  
    }  
}  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,