• 计数排序

    Accepted 1425 483MS 5276K 997 B G++
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e6 + ;
    const int MIN_NUM = -5e5;
    const int MAX_NUM = 5e5;
    // MAX_NUM - MIN_NUM 表示输入数字的范围
    int num[MAX_NUM - MIN_NUM + ];
    int main() {
    int n, m, k;
    while (~scanf("%d%d", &n, &m)) {
    while (n--) {
    scanf("%d", &k);
    // 因为存在负数而没有负下标,所以将所有输入的数减去MIN_NUM然后再存入对应下标
    num[k - MIN_NUM]++;
    }
    k = MAX_NUM - MIN_NUM;
    while (m--) {
    while (num[k] == ) {
    k--;
    }
    num[k]--;
    if (m != ) {
    printf("%d ", k + MIN_NUM);
    } else {
    printf("%d\n", k + MIN_NUM);
    }
    }
    // k后面的都已经清空了所以,这里只要清空k前面这段就好了;
    memset(num, , sizeof(int) * (k + ));
    }
    return ;
    }

    计数排序适用于排序范围已知且排序数量大,排序范围小的情况。复杂度为Ο(n+k)。n表示排序数量,k表示排序范围;计数排序还有个优点在于不用记录原数,所有只要排序范围比较小是比较省空间的;

  • 堆排序变种
    Accepted 1425 499MS 2156K 1290 B G++
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e6 + ;
    int arr[MAXN];
    int n, m, k;
    void minHeapFix (int id) {
    int mn = id << ;
    if (mn > m) {
    return;
    }
    if (mn < m && arr[mn | ] < arr[mn]) {
    mn |= ;
    }
    if (arr[mn] < arr[id]) {
    swap(arr[mn], arr[id]);
    minHeapFix(mn);
    }
    }
    int main() {
    while (~scanf("%d%d", &n, &m)) {
    // 因为题目要求前m大,所以这里的堆只维护前m大的数
    for (int i = ; i <= m; i++) {
    scanf("%d", &arr[i]);
    }
    for (int i = m >> ; i; i--) {
    minHeapFix(i);
    }
    for (int i = m + ; i <= n; i++) {
    scanf("%d", &k);
    // 这里维护的是小顶堆,堆顶最小,如果k比前m大中最小的数要大,用k替换堆顶,再维护小顶堆
    if (k > arr[]) {
    arr[] = k;
    minHeapFix();
    }
    }
    k = m;
    for (int i = ; i < k; i++) {
    swap(arr[], arr[m--]);
    minHeapFix();
    }
    for (int i = ; i < k; i++) {
    printf("%d ", arr[i]);
    }
    printf("%d\n", arr[k]);
    }
    return ;
    }

    这题用堆排好在于他不用维护n个数只要维护前m大的数就够了,但是题目中说(0<n,m<1000000)可见m也不小了,所以比计排还要慢些,如果m比较小还是很快的。

  • 快速排序变种
    Accepted 1425 468MS 3332K 1460 B G++
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e6 + ;
    int arr[MAXN];
    int n, m;
    void quickSort(int l, int r) {
    if (l >= r) {
    return;
    }
    int mid = l + r >> , id;
    if (arr[l] <= arr[mid] && arr[l] <= arr[r]) {
    id = arr[mid] <= arr[r] ? mid : r;
    } else {
    if (arr[mid] <= arr[r]) {
    id = arr[l] <= arr[r] ? l : r;
    } else {
    id = arr[l] <= arr[mid] ? l : mid;
    }
    }
    swap(arr[l], arr[id]);
    int ge = l + , lt = r;
    while (ge < lt) {
    if (arr[ge] >= arr[l]) {
    ge++;
    } else if (arr[lt] >= arr[l]){
    swap(arr[ge], arr[lt]);
    ge++;
    lt--;
    } else {
    while (arr[lt] < arr[l] && ge < lt) {
    lt--;
    }
    }
    }
    if (arr[ge] < arr[l]) {
    ge--;
    }
    swap(arr[ge], arr[l]);
    quickSort(l, ge - );
    // 变种就变在这个if, 因为只要前m大的数有序,所以当ge >= m时就不用排后面的数了
    if (ge < m) {
    quickSort(ge + , r);
    }
    }
    int main() {
    while (~scanf("%d%d", &n, &m)) {
    for (int i = ; i <= n; i++) {
    scanf("%d", &arr[i]);
    }
    quickSort(, n);
    for (int i = ; i < m; i++) {
    printf("%d ", arr[i]);
    }
    printf("%d\n", arr[m]);
    }
    return ;
    }
  • 快速排序再变种
    Accepted 1425 468MS 3332K 1264 B G++
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e6 + ;
    int arr[MAXN];
    int n, m;
    void quickSort(int l, int r, int mn, int mx) {
    if (l >= r || mn >= mx) {
    return;
    }
    // 取排序范围的中值作为mid
    int mid = mn + mx >> ;
    /*
    下面的if很重要,原先没加导致
    5 5
    1 2 3 4 5
    这组数据死循环。
    */
    if (mid == mn) {
    mid++;
    }
    int ge = l, lt = r;
    while (ge < lt) {
    if (arr[ge] >= mid) {
    ge++;
    } else if (arr[lt] >= mid){
    swap(arr[ge], arr[lt]);
    ge++;
    lt--;
    } else {
    while (arr[lt] < mid && ge < lt) {
    lt--;
    }
    }
    }
    if (arr[ge] < mid) {
    ge--;
    }
    quickSort(l, ge, mid, mx);
    if (ge < m) {
    quickSort(ge + , r, mn, mid - );
    }
    }
    int main() {
    while (~scanf("%d%d", &n, &m)) {
    for (int i = ; i <= n; i++) {
    scanf("%d", &arr[i]);
    }
    quickSort(, n, -5e5, 5e5);
    for (int i = ; i < m; i++) {
    printf("%d ", arr[i]);
    }
    printf("%d\n", arr[m]);
    }
    return ;
    }

    一般的快排都会采用三点取中法来找mid,但是这个mid并不是数组真正的中位数,所以这里采用数据范围的中值作为mid。本来以为会快一点的,但是好像和上面的快排差不多,看样子三点取中法还是很靠谱的。另外写二分一定注意死循环,快被二分死循环搞疯了。

HDU-1425-sort(计数排序以及快速排序和堆排序的变种)的更多相关文章

  1. hdu 1425:sort(排序,经典题。快排模板)

    sort Time Limit : 6000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  2. HDU 1425 sort C语言实现快速排序

    AC代码:sort Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. counting sort 计数排序

    //counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...

  4. sort(hdu oj 1425)计数排序和快速排序

    Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0 < n,m < 1000000),第二行包含n个各不 ...

  5. 『ACM C++』HDU杭电OJ | 1425 - sort (排序函数的特殊应用)

    今天真的是累哭了,周一课从早八点半一直上到晚九点半,整个人要虚脱的感觉,因为时间不太够鸭所以就回头看看找了一些比较有知识点的题来总结总结分析一下,明天有空了就开始继续打题,嘻嘻嘻. 今日兴趣电影: & ...

  6. E题hdu 1425 sort

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 sort Time Limit: 6000/1000 MS (Java/Others)    M ...

  7. Uva-------(11462) Age Sort(计数排序)

    B Age Sort Input: Standard Input Output: Standard Output   You are given the ages (in years) of all ...

  8. hdu 1425 sort 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425 常规的方法是对输入的数从大到小进行排序(可以用sort或qsort),然后输出前m大的数. 不过 ...

  9. HDU 1425 sort hash+加速输入

    http://acm.hdu.edu.cn/showproblem.php?pid=1425 题目大意: 给你n个整数,请按从大到小的顺序输出其中前m大的数. 其中n和m都是位于[-500000,50 ...

随机推荐

  1. Webstorm、Idea双击shift弹出框解决办法

    1.Ctrl + Shift + A,输入registry 2.在弹出的记录表中,向下滚动到**“ide.suppress.double.click.handler”**并选中复选框,然后close关 ...

  2. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...

  3. 常用的模型集成方法介绍:bagging、boosting 、stacking

    本文介绍了集成学习的各种概念,并给出了一些必要的关键信息,以便读者能很好地理解和使用相关方法,并且能够在有需要的时候设计出合适的解决方案. 本文将讨论一些众所周知的概念,如自助法.自助聚合(baggi ...

  4. ILSVRC2012下载

    http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tarhttp://www.image-net.or ...

  5. python代码实现购物车(django的redis与vue)

    安装模块 pip install django-redis 后端代码 # 购物车 class CartView(APIView): # 初始化函数 def __init__(self): self.c ...

  6. 吴裕雄--天生自然TensorFlow高层封装:使用TFLearn处理MNIST数据集实现LeNet-5模型

    # 1. 通过TFLearn的API定义卷机神经网络. import tflearn import tflearn.datasets.mnist as mnist from tflearn.layer ...

  7. C#.NET中的ToString()数字格式化

    数字格式字符串-----货币-----.ToString("C");.ToString("c");例 2.5.ToString("c") - ...

  8. 【shell基础】

    Ctrl+R 搜索之前的命令 Ctrl+D 退出 Ctrl+A 移动到行首 Ctrl+E 移动到行尾 Ctrl+U 删除光标前的内容 Ctrl+K 删除光标后的内容 Ctrl+S 锁频 Ctrl+Q ...

  9. element ui 自定义异步验证

    之前提到过,axios是一个异步请求,但是很多时候我们都需要同步请求,比如在element的表单验证中需要验证一个用户名是否存在的时候,异步请求好像就不太好用了.前边博客中提到过,这种情况可以用es6 ...

  10. PyTorch基础——使用神经网络识别文字中的情感信息

    一.介绍 知识点 使用 Python 从网络上爬取信息的基本方法 处理语料"洗数据"的基本方法 词袋模型搭建方法 简单 RNN 的搭建方法 简单 LSTM 的搭建方法 二.从网络中 ...