/*
    本文是选择问题:

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

最新文章

  1. out与ref的区别
  2. markdown思维导图笔记
  3. linq判断集合是否为空的方法
  4. java mybatis 中sql 模糊查询
  5. java实现抓取某公司官网新闻
  6. 雷军北大演讲:除了聪明和勤奋我们还需要什么(关键是有了梦想以后,你能不能把这个东西付诸实践)good
  7. java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)(ERR=12505)(ERR
  8. Flashback Query(函数示例)
  9. Java疯狂讲义(四)
  10. Java 集合 持有引用 &amp; WeakHashMap
  11. flash检测网络是否通畅
  12. R语言︱文本挖掘——词云wordcloud2包
  13. kruskal重构树学习笔记
  14. docker部署项目 &lt;三&gt;
  15. Android开发过程中的坑及解决方法收录(二)
  16. k8s 廖老师的分享
  17. java程序的三种结构
  18. 【转】python实战——教你用微信每天给女朋友说晚安
  19. sv命令空间 packge
  20. win7环境下安装composer

热门文章

  1. Docker Compose practice
  2. 使用apt-get安装Nginx
  3. docker centos:last 开启sshd 遇到的证书问题
  4. day06作业
  5. 洛谷P2422 良好的感觉
  6. Linux学习笔记:输入输出重定向 &gt;&gt;命令
  7. Python 面试题学习
  8. 题解-python-CodeForces 1A
  9. C#socket编程序(二)
  10. 一步一步学习IdentityServer3 (13) 令牌