二、排序问题1

 

2.1.1 题目中n<1000,故可以考虑使用冒泡排序O(n^2)

程序中while (scanf ("%d",&n) != EOF )   //输入n并实现多组数据的输入

若输入为字符串,则程序采用gets()的方法读入,相应的循环判断语句为while( get(字符串变量) );

#include <stdio.h>

int main () {
    int n;
    int a[100];//
    while (scanf ("%d",&n) != EOF ) { //输入n并实现多组数据的输入
        for (int i = 0;i < n;i ++) {
            scanf("%d",&a[i]);
        }
        for (int i = 0;i < n-1;i ++) {    //冒泡排序 
            for (int j = 0;j < n-i-1;j ++) {
                if (a[j+1] < a[j]) {
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
        for (int i = 0;i < n;i ++) {
            printf("%d ",a[i]);
        }
        printf("\n");//输出换行 
    }
    return 0; 
} 

2.1.2 若n值大于3000,则O(n^2)超过百万数量级,应使用快排

C++中有快速排序库函数,添加algorithm头文件

#include <stdio.h>
#include <algorithm>
using namespace std;
 int main () {
     int n;
     int a[10000];
     while (scanf("%d",&n) != EOF ) {
         for(int i = 0;i < n;i ++) {
             scanf("%d",&a[i]);
         } 
         sort (a,a+n);    //快速排序
         for(int i = 0;i < n;i ++) {
             printf("%d ",a[i]);
         } 
         printf("\n");
     }
     return 0;
 } 

2.1.3 同时,可以定义sort()函数中第三个参数,进行降序排列

新定义一个cmp函数,实现新的排序规则定义,当cmp返回值为true时,表示cmp函数第一个参数排在第二个参数前面。

#include <stdio.h>
#include <algorithm>
using namespace std;

bool cmp(int x,int y){    //自定义排序函数
    return x > y;
}
int main () {
    int n;
    int a[10000];
    while (scanf("%d",&n) != EOF) {
        for(int i = 0;i < n;i ++){
            scanf("%d",&a[i]);
        }
        sort(a,a + n,cmp);
        for(int i = 0;i < n;i ++){
            printf("%d ",a[i]);
        }
        printf("\n");
        
    }
    return 0;
}

 

posted @ 2018-01-04 17:25  思丿无邪  阅读(179)  评论(0编辑  收藏  举报