选择问题(选择数组中第K小的数)

由排序问题可以引申出选择问题,选择问题就是选择并返回数组中第k小的数,如果把数组全部排好序,在返回第k小的数,也能正确返回,但是这无疑做了很多无用功,由上篇博客中提到的快速排序,稍稍修改下就可以以较小的时间复杂度返回正确结果。

代码如下:

#include<iostream>
using namespace std;

#define Cutoff 3

int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};

void Swap(int &a, int &b)
{
   int c;
  c = a;
  a = b;
  b = c;
}

void InsetionSort (int A[], int N)   //插入排序
{
    int j, p;
    int Tmp;
    for (p = 1; p < N; p++)
    {
       Tmp = A[p];
       for(j = p; j > 0 && A[j - 1] > Tmp; j--)
           A[j] = A[j - 1];
       A[j] = Tmp;
    }
}

int Median (int A[],int Left, int Right)   //实现三数中值分割,选取枢纽元
{
   int Center = (Left + Right ) / 2;

   if(A[Left] > A[Center])
       Swap(A[Left] , A[Center]);
   if(A[Left] > A[Right])
       Swap(A[Left] , A[Right]);
   if(A[Center] > A[Right])
       Swap(A[Center] , A[Right]);

   /* A[Left] <= A[Center] <= A[Right] */
   Swap(A[Center], A[Right - 1]);    //把枢纽元放在倒数第二个
   return A[Right - 1];
}

void Qselete (int A[], int k, int Left, int Right)
{
   int i, j;
   int Pivot;
   if(Left + Cutoff <= Right)
   {
      Pivot = Median(A,Left,Right);
      i = Left; j = Right - 1;
      for( ; ; )
      {
          while(A[++i] < Pivot) { }
          while(A[--j] > Pivot) { }
          if(i < j)
              Swap(A[i], A[j]);
          else
              break;
      }
      Swap(A[i], A[Right - 1]);   // 恢复枢纽元的位置
     if(k <= i)
		Qselete (A, k, Left, i -1);
	 else
        Qselete (A, k, i + 1, Right);
   }
   else
   InsetionSort (A + Left, Right - Left + 1);
}

int  Quick_Sort (int A[], int k, int N)
{
	Qselete (A, k - 1, 0, N - 1);
	return A[k - 1];
}

int main ()
{
	 cout << Quick_Sort (A , 3, 13) << endl;
   return 0;
}

  思想很不错,值得学习。

夜深了,,,

唉,失恋的人就是矫情,写个博客还得装逼一下

时间: 2024-07-30 13:50:11

选择问题(选择数组中第K小的数)的相关文章

求数组中第k小的数,有快速排序的验证

// The_Least_K_number.cpp : 定义控制台应用程序的入口点. //数组中第k小的数,例如a[1000]中第250小的数// #include "stdafx.h" #include <iostream> using namespace std; void swap(int *p, int *q) { int temp = *p; *p = *q; *q = temp; } int patition(int a[], int first, int la

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

找到轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[size]) { l = mid + 1;

找轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[r]) { l = mid + 1; }

挑战面试编程:查找数组中第k大的数

查找数组中第k大的数 问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思路: 1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. 只需找到第k大的数,不必把所有的数排好序.我们借助快速排序中partition过程,一般情况下,在把所有数都排好序前,就可以找到第k大的数.我们依据的逻辑是,经过一次partition后,数组被pivot分成左右两部分:S左.S右.当S左的元素个数|S左|等于k-1时,pivo

九度OJ 1534 数组中第K小的数字

题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1524 解决:307 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字. 输入: 输入可能包含多个测试案例. 对于每个测试案例,输入的第一行为三个整数m,n, k(1<=m,n<=100000, 1&l

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

顺序统计:寻找序列中第k小的数

最直观的解法,排序之后取下标为k的值即可. 但是此处采取的方法为类似快速排序分块的方法,利用一个支点将序列分为两个子序列(支点左边的值小于支点的值,支点右边大于等于支点的值). 如果支点下标等于k,则支点就是查找的值,如果支点的下标大于k,则在左子序列里继续寻找,如果支点下标小于k,则继续在支点右子序列里面继续寻找第(k-支点下标)小的值. c#实现算法如下: public class FindSpecialOrderElement<T> where T : IComparable<T&

【LeetCode-面试算法经典-Java实现】【215-Kth Largest Element in an Array(数组中第K大的数)】

[215-Kth Largest Element in an Array(数组中第K大的数)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth d