Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163945
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 622
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 19:12
文章分类

全部博文(67)

分类: C/C++

2015-04-15 16:53:21

方法1:升序排序之后取第k个
            排序算法用归并排序、插入排序对应的时间复杂度分别为O(nlgn)、O(n2)
方法2:用归并排序的思想,类似二分法
          假设针对int arr[]在[l, h)区间取第k小的数
          
         步骤1、保证h-l>=k
         步骤2、取arr[l],将其移动到位置m,使m的左边都小于arr[l],右边都大于arr[l]
         步骤3、如m-l+1==k,则a[m]即是
                    若m-l+1>k,则在[l, m)区间找第k小的
                    若m-l+1[m+1, h)区间找第k-(m-l+1)小的
        可见,这是一个递归过程,代码如下:
        int arr[] = {8,1,3,6,9,0,4,7,5,2}; 
        int len = sizeof(arr)/sizeof(arr[0]);
        int find(int l, int h, int k) //l和h确定区间,k指定第几个       
        {
            if( (h-l) < k ) cout<<"error"<             int m = l, falg = 0, key = arr[l], t = 0;
            for(int i = l; i             {
                if( flag == 0)
                {
                    if( arr[i] < key)
                        ++m;
                    else
                        flag = 1; //表示接下来 arr[i] < key的要交换了
                }
                else
                {
                    if( arr[i] < key
                    {
                    
    ++m;
                        t = arr[i]; arr[i] = arr[m]; arr[m] = t;

                    }
                }
            }
            arr[l] = arr[m]; arr[m] = key;
            if( (m-l+1) == k) 
                cout<             else 
if( (m-l+1) > k)
                find(l, m, k);

            else
                find(m+1, h, k-(m-l+1)); //左边已经m-l+1个小的了

        }

注意点:确定接下来在哪个部分查找,以及要找第几小的

阅读(831) | 评论(0) | 转发(0) |
0

上一篇:编程输出一个菱形

下一篇:归并排序

给主人留下些什么吧!~~