/*
    本文是选择问题:

选择一组N个数当中的第k小的数(第k大的数类似)
     集中方法的实现代码

*/
 
 
 
#include "sorting.h"
#include "fatal.h"
 
#define SORTING_BUBBLE  1
#define SORTING_INSERTION   2
#define SORTING_SELECTION   3
#define SORTING_SHELL       4
#define SORTING_QUICK       5
#define SORTING_HEAP        6
#define SORTING_MERGE       7
 
 
/*
    解法1: 我们可以对这个乱序数组按照从小到大先行排序,然后

取出前k大,总的时间复杂度为O(n*logn + k)。

*/
 
int select_by_sorting(int A[], int N, int k, int SortingMethod)
{
     || k > N )
    {
        fprintf (stderr, "error, k ??????\n");
        exit (EXIT_FAILURE);
    }
    switch(SortingMethod)
    {
    case SORTING_BUBBLE :
        bubble_sort (A, N,IntComp);
         ];
    case SORTING_INSERTION :
        insertion_sort (A, N,IntComp);
         ];
    case SORTING_SELECTION :
        selection_sort (A, N,IntComp);
         ];
    case SORTING_SHELL :
        shell_sort (A, N,IntComp);
         ];
    case SORTING_QUICK :
        quick_sort (A, N,IntComp);
         ];
    case SORTING_HEAP :
        heap_sort (A, N,IntComp);
         ];
    case SORTING_MERGE :
        merge_sort (A, N,IntComp);
         ];
    default:
        Error ("not a known sorting method!");
    }
    ;
}
/*
    解法2: 先把前k个元素读进数组并排序(递增顺序),接着,将剩下

的元素逐个读入。当新元素大于数组中的第k个元素是则忽略,否则将
     其放入正确的位置,旧的第k个元素将被挤掉!

*/
int select2(int A[], int N, int k)
{
    // 可改进为前面k个数原地排序。
    int *Ak = malloc(sizeof(int )*k);
    Ak ];
    int i,;
    ; i < k; i++)
    {
          ; j--)
         {
             if([i]< Ak[j])
                Ak ] = Ak[ j];
             else
                 break;
         }
        Ak ] = A[ i];
    }
    for(= k ; i < N; ++)
    {
         ]<= A [i]) continue;
        
         ; --j)
         {
             if([i] < Ak[])
                Ak ] = Ak[ j];
             else
                 break;
         }
        Ak ] = A[ i];
    }
    ];
    free(Ak );   
    return ret ;
}
 
/*
    解法3:利用选择排序或交互排序,K次选择后

即可得到第k大的数。总的时间复杂度为O(n*k)

*/
 
int select3(int A[], int N, int k)
{
    int minIndex ;
    int tmp;
    int i,;
    ; i <k; ++i)
    {
        minIndex = i;
         ; j <N; ++j)
             if([minIndex] > A [j])
                minIndex = j;
        tmp = A[ minIndex];
        A [minIndex] = A [i];
        A [i] = tmp;
    }
    ];
}
 
/*
    解法4:利用快速排序的思想,从数组S中随机找出一个元素X,

把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素
     小于X。这时有两种情况:
          1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
          2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

 
*/
int partition(int A[], int p, int q)
{
    // select a pivot
    // for simplicity select p as pivot
    int i,;
    i = p ;
    int tmp;
    ; j <= q ; j++)    
    {
         if([j] < A[])
         {
             ++i;
             if(== j)
                 continue;
            tmp = A[ i];
            A [i] = A[];
            A [j] = tmp;
         }
    }
    tmp = A [i];
    A[] = A[p];
    A[] = tmp;
    return i ;
}
int findk( int A[], int p, int q, int k)
{
    int r = partition (A, p,q);
     == r)
         return A[ r];
    )
    {
         , k);
    }else
          ,q, k);
}
int select4(int A[], int N, int k)
{
    , k);
}
 
 
#define ITEMNUM 5000
#define METHODNUM 10
int main()
{
    int A[METHODNUM ][ITEMNUM];
    ;
    int temp;
     ; i < ITEMNUM; ++i)
    {
        temp = rand();
         ; j < METHODNUM; j++)
            A [j][ i] = temp ;
    }
    
    int r1,r2 ,r3, r4,r5,r6 ,r7, r8;
    r1 ],ITEMNUM ,k, SORTING_BUBBLE);
    r2 ],ITEMNUM ,k, SORTING_INSERTION);
    r3 ],ITEMNUM ,k, SORTING_SELECTION);
    r4 );
    r5 );
    r6 );
    r7);
    r8 ],ITEMNUM ,k);
    ],ITEMNUM ,k);
    printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n" ,r1, r2,r3,r4 ,r5, r6,r7,r8 );
    printf("%d\n" ,r9);
    ],ITEMNUM ,k);
    printf("%d\n" ,r10);
    ;
}

选择问题(selection problem)的更多相关文章

  1. 选择屏幕(Selection Screen)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 排序算法 - 选择排序(selection sort)

    选择排序(Selection sort)跟插入排序一样,也是O(n^2)的复杂度,这个排序方式也可以用我们的扑克牌来解释. 概念 桌面上有一堆牌,也是杂乱无章的,现在我们想将牌由小到大排序,如果使用选 ...

  3. 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

    选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...

  4. ISLR系列:(4.1)模型选择 Subset Selection

    Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...

  5. 排序算法--选择排序(Selection Sort)_C#程序实现

    排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  6. 选择排序 Selection Sort

    选择排序 Selection Sort 1)在数组中找最小的数与第一个位置上的数交换: 2)找第二小的数与第二个位置上的数交换: 3)以此类推 template<typename T> / ...

  7. the steps that may be taken to solve a feature selection problem:特征选择的步骤

    參考:JMLR的paper<an introduction to variable and feature selection> we summarize the steps that m ...

  8. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  9. 【ABAP系列】SAP ABAP选择屏幕(SELECTION SCREEN)事件解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP选择屏幕(SEL ...

随机推荐

  1. 21 JSON and Go go语言和json

    JSON and Go 25 January 2011 Introduction JSON (JavaScript Object Notation) is a simple data intercha ...

  2. HTML语义化(2016/3/16更新)

    目录 什么是HTML语义化? 为什么要语义化 常用标签的语义 HTML5新元素 一.什么是HTML语义化? 简单来讲就是:每个标签做自己的事,使得能够被机器直接读懂. 二.为什么要语义化? 1.更容易 ...

  3. HDU 3613 Best Reward(manacher求前、后缀回文串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 题目大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分 ...

  4. Kafka压力测试(自带测试脚本)(单机版)

    一.测试目的 本次性能测试在正式环境下单台服务器上Kafka处理MQ消息能力进行压力测试.测试包括对Kafka写入MQ消息和消费MQ消息进行压力测试,根据10w.100w和1000w级别的消息处理结果 ...

  5. FlumeNG介绍及安装部署

    本节内容: Flume简介 Flume NG核心组件 Flume部署种类 Flume单机安装 一.Flume简介 Flume是一个分布式.可靠.高可用的海量日志聚合系统,支持在系统中定制各类数据发送方 ...

  6. hdu 5112 (2014北京现场赛 A题)

    给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.0 ...

  7. mongo体系架构学习

    MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据 ...

  8. SRILM语言模型格式解读

    先看一下语言模型的输出格式 \data\ ngram = ngram = ngram = \-grams: -5.24036 'cause -0.2084827 -4.675221 'em -0.22 ...

  9. RAII

    转载:http://www.jellythink.com/archives/101 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C ...

  10. 【LOJ】#2062. 「HAOI2016」地图

    题解 我对莫队真是一无所知 这个东西显然可以用圆方树转成一个dfs序列 然后呢,用莫队计算每个询问区间的每个数出现的次数,从而顺带计算每个数字的奇偶性 但是我们要查的数字也用一个范围,可以直接用分块维 ...