zoukankan      html  css  js  c++  java
  • HDU1425 sort

    问题链接HDU1425 sort基础训练题,用C语言编写程序。

    问题简述:参见上述链接。

    问题分析本问题是对于n个数据,求最大的m个元素。类似于求第k小元素问题,可以用分治法来实现。基于快速排序(Quicksort)算法程序,略作修改就可以实现。

    前m个元素(大的元素)使用快速排序,后面的元素(小的元素)就不需要排序。

    程序说明:(略)。

    AC的C语言程序如下:

    /* HDU1425 sort */
    
    #include <stdio.h>
    
    #define MAXN 1000000
    
    int data[MAXN];
    
    // 划分:大的放在主元的左边,小的放在主元的右边
    int split(int a[], int low, int high)
    {
      int part_element = a[low];
    
      for (;;) {
        while (low < high && part_element >= a[high])
          high--;
        if (low >= high) break;
        a[low++] = a[high];
    
        while (low < high && a[low] >= part_element)
          low++;
        if (low >= high) break;
        a[high--] = a[low];
      }
    
      a[high] = part_element;
      return high;
    }
    
    // 找出最大的m个数:使用分治法,在快速排序的基础上修改而成
    void mmaxsort(int a[], int low, int high, int m)
    {
      int middle;
    
      if (low >= high) return;
      middle = split(a, low, high);
    
      mmaxsort(a, low, middle - 1, m);
      // 只需要考虑左边的m个元素,其他部分不用排序
      if(middle + 1 < m)
        mmaxsort(a, middle + 1, high, m);
    }
    
    int main(void)
    {
        int n, m, i;
    
        while(scanf("%d%d", &n, &m) != EOF) {
            // 读入数据
            for(i=0; i<n; i++)
                scanf("%d", &data[i]);
    
            // 排序
            mmaxsort(data, 0, n-1, m);
    
            // 输出结果
            for(i=0; i<m; i++) {
                if(i)
                    printf(" ");
                printf("%d", data[i]);
            }
            printf("
    ");
        }
    
        return 0;
    }


  • 相关阅读:
    [转]oracle数据库定时任务dbms_job的用法详解
    身份证号码的正则表达式及验证详解(JavaScript,Regex)
    js数组操作
    jq滚动到底部加载更多方法
    jq之实现轮播
    node之npm一直出错
    Jq之21点游戏
    移动端屏幕适配viewport
    meta属性
    用户体验之表单结构
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564561.html
Copyright © 2011-2022 走看看