• 基于快排的区间K值算法


    #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);
        }
    }
    
  • 相关阅读:
    java中原子操作的实现分析
    AQS源码分析
    Java JNDI 学习
    门面模式、代理模式、适配器模式的区别
    tomcat源码阅读之StandardWrapper解析
    tomcat源码阅读之过滤器
    tomcat源码阅读之SingleThreadModel
    tomcat源码阅读之单点登录
    技术人员的八条宝贵经验,时刻提醒自己,共勉之
    tomcat源码阅读之安全机制
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2543251.html
Copyright © 2020-2023  润新知