选择问题(selection problem)

/*

本文是选择问题:

选择一组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)

{

if(<|| k > N )

{

fprintf (stderr, "error, k ??????\n");

exit (EXIT_FAILURE);

}

switch(SortingMethod)

{

case SORTING_BUBBLE :

bubble_sort (A, N,IntComp);

return A[ k-1];

case SORTING_INSERTION :

insertion_sort (A, N,IntComp);

return A[ k-1];

case SORTING_SELECTION :

selection_sort (A, N,IntComp);

return A[ k-1];

case SORTING_SHELL :

shell_sort (A, N,IntComp);

return A[ k-1];

case SORTING_QUICK :

quick_sort (A, N,IntComp);

return A[ k-1];

case SORTING_HEAP :

heap_sort (A, N,IntComp);

return A[ k-1];

case SORTING_MERGE :

merge_sort (A, N,IntComp);

return A[ k-1];

default:

Error ("not a known sorting method!");

}

return 0;

}

/*

解法2: 先把前k个元素读进数组并排序(递增顺序),接着,将剩下

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

*/

int select2(int A[], int N, int k)

{

// 可改进为前面k个数原地排序。

int *Ak = malloc(sizeof(int )*k);

Ak[] = A[0];

int i,;

for(= 1; i < k; i++)

{

for(= i- 1; j >= 0 ; j--)

{

if([i]< Ak[j])

Ak [j+ 1] = Ak[ j];

else

break;

}

Ak [j+ 1] = A[ i];

}

for(= k ; i < N; ++)

{

if(Ak [k- 1]<= A [i]) continue;

for(= k- 2; j >=0; --j)

{

if([i] < Ak[])

Ak [j+ 1] = Ak[ j];

else

break;

}

Ak [j+ 1] = A[ i];

}

int ret = Ak [k- 1];

free(Ak );

return ret ;

}

/*

解法3:利用选择排序或交互排序,K次选择后

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

*/

int select3(int A[], int N, int k)

{

int minIndex ;

int tmp;

int i,;

for(= 0; i <k; ++i)

{

minIndex = i;

for(= i+ 1; j <N; ++j)

if([minIndex] > A [j])

minIndex = j;

tmp = A[ minIndex];

[minIndex] = A [i];

[i] = tmp;

}

return A [k- 1];

}

/*

解法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,;

= p ;

int tmp;

for(= p +1; j <= q ; j++)

{

if([j] < A[])

{

++i;

if(== j)

continue;

tmp = A[ i];

[i] = 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);

if(k-== r)

return A[ r];

else if(> k - 1)

{

return findk( A,p,-1, k);

}else

return findk( A,r+,q, k);

}

int select4(int A[], int N, int k)

{

return findk (A, 0,-1, k);

}

#define ITEMNUM 5000

#define METHODNUM 10

int main()

{

int A[METHODNUM ][ITEMNUM];

int k = 564;

int temp;

for(int i = 0 ; i < ITEMNUM; ++i)

{

temp = rand();

for(int j = 0; j < METHODNUM; j++)

[j][ i] = temp ;

}

int r1,r2 ,r3, r4,r5,r6 ,r7, r8;

r1 = select_by_sorting (A[ 0],ITEMNUM ,k, SORTING_BUBBLE);

r2 = select_by_sorting (A[ 1],ITEMNUM ,k, SORTING_INSERTION);

r3 = select_by_sorting (A[ 2],ITEMNUM ,k, SORTING_SELECTION);

r4 = select_by_sorting (A[ 3],ITEMNUM ,k, 4);

r5 = select_by_sorting (A[ 4],ITEMNUM ,k, 5);

r6 = select_by_sorting (A[ 5],ITEMNUM ,k, 6);

r7= select_by_sorting (A[ 6],ITEMNUM ,k, 7);

r8 = select2 (A[ 7],ITEMNUM ,k);

int r9 = select3 (A[ 8],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);

int r10 = select4 (A[ 9],ITEMNUM ,k);

printf("%d\n" ,r10);

return 0;

}

选择问题(selection problem)

时间: 2024-08-30 02:28:51

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

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

Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applications in R 的系列读书笔记,作为本人的一份学习总结,也希望和朋友们进行交流学习. 该书是The Elements of Statistical Learning 的R语言简明版,包含了对算法的简明介绍以及其R实现,最让我感兴趣的是算法的R语言实现. [转载时请注明来源]:http://www

选择屏幕(Selection Screen)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292295.html 选择屏幕(Selection Screen). 156 创建选择屏幕... 157 SELECTION-SCREEN.. 157 SELECTION-SCREEN - BEGIN OF SCREEN.. 157 标准选

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 may be taken to solve a feature selection problem in a check list: 1. Do you have domain knowledge? If yes, construct a better set of "ad hoc" fea

经典排序算法 - 选择排序Selection sort

经典排序算法 - 选择排序Selection sort 顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完 再简单点,对着一群数组说,你们谁最小出列,站到最后边 然后继续对剩余的无序数组说,你们谁最小出列,站到最后边 再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大 举例 先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9] 第一趟找到最小数1,放到最前边(与首位数字交换) 交换前

【排序算法】选择排序(Selection sort)

0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n-1 次交换.在所有的完全依

Selection Problem (选择问题)

在一个由n个元素组成的集合中,第i个“顺序统计量(order statistic)”是该集合中第i小的元素.例如,在一个由n个元素组成的集合中,最小值是第1个顺序统计量,最大值是第n个顺序统计量.而“中位数(median)”总是出现在low((n+1)/2)或者high((n+1)/2)处,其中low是向下取整(“下中位数”),high是向上取整(“上中位数”),当n为奇数的时候,只有“下中位数”,而n为偶数的时候,同时有“下中位数”和“上中位数”. 选择问题的定义如下. 输入:一个包含n个不同

选择排序 Selection Sort

选择排序算法的运作如下: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完. 选择排序算法的实现我放在这里. 时间/空间复杂度: 选择排序的交换操作介于0和(n-1)次之间.选择排序的比较操作为n(n-1)/2次之间.选择排序的赋值操作介于0和3(n-1)次之间. 比较次数O(n^2),交换次数O(n),最好情况是已经有序,交换0次:最坏情况是逆序,交换n-1次.交换次数比冒泡排序少,由 于交换所需CPU时间比比较所需的CPU时间

基础算法之选择排序Selection Sort

原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕.一种简单直观的排序算法. 例子 将数组[3,6,4,2,5,1]进行从大到小排序 排序步骤: 第一趟找到最小数1,放到最前边(与首位数字交换) 交换前:| 3 | 6 | 4 | 2 | 5 | 1 | 交换后:| 1 | 6 | 4 | 2 | 5 | 3 | 第二趟找到剩余[6,4,2,5,3]数字里的最小数2,与

《数据结构与算法分析》引论:选择问题实现

在<数据结构与算法分析--C语言描述>的引论中有提到一个问题: 设有一组N个数而要确定其中第k个最大者. 被称为选择问题(selection problem). 后面有提到两种算法,下面是我根据描述,写的代码: /* * 来源:<数据结构与算法分析>引论 * 题目:选择性问题,从N个数中找出第k大者 * * */ #include <stdio.h> #include <stdlib.h> /* * 输出数组 * */ void printfArray(in