美文网首页
重拾算法Day04-去重并排序

重拾算法Day04-去重并排序

作者: 面试小集 | 来源:发表于2016-11-04 08:32 被阅读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;
}

相关文章

  • 重拾算法Day04-去重并排序

    问题背景 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢看那些书,小哼让每个同学写出一...

  • js数组分组和去重

    分组 去重 笔试中经常出现的js数组排序与去重算法

  • 集合处理方法

    使用es6的方式去重 使用indexOf的方式去重 需同一地址下 使用hash的方式去重 算法排序 冒泡排序 对象...

  • js基础算法

    排序 排序有很多种算法,这里只写基本的冒泡排序和快速排序 去重 这里写三种方法

  • 前端面试算法题

    算法题汇总 编写一个数组去重的方法 统计字符串中字母个数并统计最多字母数 3.快速排序 "快速排序"的整个过程只需...

  • UNION与UNION ALL的区别

    UNION去重且排序,UNION ALL不去重不排序。 UNION表示“并”,当用的时候,系统会自动将重复的元组去...

  • JS实现的常见算法

    1.冒泡排序 2.简单选择排序 3.直接插入排序 4.希尔排序 5.去重算法 6.快速排序

  • 模板

    并查集 拓扑排序 Floyd算法 Dijkstra算法

  • # 前端面试准备(day1)

    js算法与应用 排序部分 快速排序 优化过的冒泡排序 数组去重 编写一个JavaScript函数,输入指定类型的选...

  • C++11时代的标准库快餐教程(4) - 排序算法的应用

    排序算法的应用 用排序做集合运算 - 子集,交集,并集与差集 上一节我们讲了排序算法,包括快速排序sort,堆排序...

网友评论

      本文标题:重拾算法Day04-去重并排序

      本文链接:https://www.haomeiwen.com/subject/xtdiuttx.html