基于快排的区间K值算法

简介: #include #include #include using namespace std; int n; int QuickSort(int *a,int left,int right); int search(int *a,int i,int j,int k); void ...
#include <cstdio>
#include<iostream>
#include<stdlib.h>
using namespace std;
int n;
int QuickSort(int *a,int left,int right);
int search(int *a,int i,int j,int k);
void swap(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int k_max;
    int a[100];
    cin >> n ;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    cin >> k_max;
    cout << search(a,1,n,k_max)<<endl;
  //  for (int i = 1; i <= n; ++i)
        //printf("%d	",a[i]);
  //  printf("\n");
    system("pause"); 
    return 0;
}
/*一次快速排序,返回被定位元素的位置,快排过程中关键元素始终不变*/
int QuickSort(int *a,int left,int right)
{
    int i,j,temp;
    i=left;
    j=right;
    temp=a[left];
    if (left>right)
        return -1;
    /*一前一后往中间搜索*/
    while (i!=j)
    {
        while (a[j]>=temp && j>i)
            j--;
        /*并没有交换,因只需找到某个确定位置即可*/
        if (j>i)
        {
            //a[i++]=a[j];
            swap(a+i,a+j);
            /*cout<<a[i]<<a[j];发现输出了很多数 */
            i++;
        }//必须加上大括号
        //for (int i = 1; i <= n; ++i)
           // printf("%d	",a[i]);
       // printf("\n");
        while (a[i]<=temp && j>i)
            i++;
        if (j>i)
        {
            //a[j--]=a[i];
            swap(a+j,a+i);
            j--;
        } //必须加上大括号
       // for (int i = 1; i <= n; ++i)
       //     printf("%d	",a[i]);
       // printf("\n");
    }
    a[i]=temp;
    return i;
}
//分治查找第k大的元素
int search(int *a,int i,int j,int k)
{
    int temp;
    if (j < i)
    {
        return -1;
    }
    if (i == j)
    {
        return a[i];
    }
    //得到第i个元素被定位的下标
    temp = QuickSort(a,i,j);
    //相等说明找到第k个大的元素
    if (temp == k)
    {
        return a[k];
    }
    //比k大,往左缩小查找范围
    else if (temp > k )
    {
        return search(a,i,temp-1,k);
    }
    /*比k小,往右缩小超找范围,注意此时k不是k-temp */
    else
    {
        return search(a,temp+1,j,k);
    }
}

 

目录
相关文章
|
7月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
46 0
|
6月前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
6月前
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
6月前
|
算法
基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真
```markdown # 摘要 本课题聚焦于基于仿射区间的分布式三相配电网潮流算法在MATLAB2022a中的仿真。算法利用仿射运算处理三相不平衡情况及分布式电源注入,旨在提供比区间算法更精确的不确定区域。仿真结果展示了算法优势。核心程序设计考虑了PQ、PV及PI节点,将不同类型的节点转换统一处理,以适应含分布式电源的配电网潮流计算需求。 ``` 这个摘要以Markdown格式呈现,总字符数为233,满足了240字符以内的要求。
|
7月前
|
算法 C++
c++算法学习笔记 (12) 区间合并
c++算法学习笔记 (12) 区间合并
|
7月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
7月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
7月前
|
搜索推荐 算法 大数据
13.经典 O(nlogn) 复杂度算法之快排
13.经典 O(nlogn) 复杂度算法之快排
163 1
|
7月前
|
搜索推荐 算法 大数据
经典 O(nlogn) 复杂度算法之快排
经典 O(nlogn) 复杂度算法之快排
60 0
下一篇
DataWorks