zoukankan      html  css  js  c++  java
  • 基于快排的区间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);
        }
    }
    
  • 相关阅读:
    DMZ区
    集群(cluster)和高可用性(HA)的概念
    JS禁用右键,禁用打印,防止另存为,IE浏览器识别(转载)
    window.open实现模式窗口(只弹出一个window.open)
    Textarea自适应高度 JS实现,兼容IE67891011
    JQ基础语法
    SQL 小笔记
    CSS样式笔记
    IE8下 Select文字垂直居中的办法
    汉字转全拼音函数优化方案(SQLServer),值得你看看
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2543251.html
Copyright © 2011-2022 走看看