重拾算法Day04-去重并排序

2016-11-04  本文已影响22人  面试小集

问题背景

小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢看那些书,小哼让每个同学写出一个自己最想读的书的ISBN号,去掉重复的ISBN号,然后从小到大排序后交给老师~~ 要求1秒完成啊~~

解决方案

先去重后排序

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    int n;
    int a[1001];
    scanf("%d", &n);    //要排序的个数
    for (int i=0; i<1001; i++) {  //
        a[i] = 0;
    }
    int k;
    for (int i=0; i<n; i++) {
        scanf("%d", &k);
        a[k] = 1;
    }
    
    for (int i=0; i<1001; i++) {
        if (a[i]==1) {
            printf("%d ", i);
        }
    }
    return 0;
}

先排序后去重

#include <stdio.h>
int n;
int a[1001];

int main(int argc, const char * argv[]) {
    // insert code here...
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    
    //排序,冒泡排序
    for (int i=0; i<n-1; i++) {
        for (int j=1; j<n-i; j++) {
            if (a[j-1]>a[j]) {
                int t = a[j-1];
                a[j-1] = a[j];
                a[j] = t;
            }
        }
    }
    
    //去重
    int k = -1;
    for (int i=0; i<n; i++) {
        if (k!=a[i]) {
            printf("%d ",a[i]);
        }
        k = a[i];
    }

    return 0;
}

分析

假如每个图书ISBN号都是11000的整数,并且参加调查的同学数不超过100,计算机每秒大约运行10亿次,因此以上两中方法都能满足需求。如果图书ISBN号是在-21474836482147483647的话那么第一种方法就不可行了,因为无法申请出这么大的数组来标记每一个ISBN号。使用冒泡排序对10万个数进行排序,计算机需要执行100亿次,显然无法在1秒钟完成。所以这个可以将冒泡排序改为快速排序,100000 * lg(100000) ~ 170万次。可以完成的。

快速排序

#include <stdio.h>
int n;
int a[1001];

void quitSort(int left, int right) {
    
    if (left > right) {
        return;
    }
    
    
    int i=left;
    int j=right;
    
    int temp = a[left];
    while (i!=j) {
        while (a[j] >= temp && j > i) {
            j--;
        }
        
        while (a[i] <= temp && j > i) {
            i++;
        }
        
        if (j>i) {
            int t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }
    
    a[left] = a[i];
    a[i] = temp;
    
    
    quitSort(left, i-1);
    quitSort(i+1, right);
    
    return;
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    scanf("%d", &n);
    
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    
    quitSort(0, n-1);
    
    //去重
    printf("%d ",a[0]);
    for (int i=1; i<n; i++) {
        if (a[i]!=a[i-1]) {
            printf("%d ", a[i]);
        }
    }
    
    printf("\n");
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读