zoukankan      html  css  js  c++  java
  • 快速排序+折半查找 c++

    #include <iostream>
    using namespace std;
    
    
    //快排
    void quickSort(double *q ,int n)   //一个double型数组还有一个代表这个数组的位数。 
    {
    
        double *left,*right;
        left = &q[0];
        right = &q[n-1];
        double middle = q[0];
    //    cout<<"left指向数组第一位,值为"<<*left<<endl;
    //    cout<<"right指向数组最右一位,值为"<<*right<<endl;
        while(left != right)
        {
            if (*right < middle)
            {
                *left = *right;
                while (*left < middle)
                {
                    left++;
                    if (left == right)
                    {
                        break;
                    }
                }
                *right = *left;
            } else {
                right--;
            }
    
        }
        //左右指针指向一致时把middle给这个位置
        *left = middle;
    
        //接下来取得*left和*right指向数组的位数
        int count = 0;   //count1表示有count1个数在middle左边,最小为0
        for(;q[count]<middle;count++) { }
        //
        //处理middle的左边
        if (count>1)
        {
            double *qq = new double[count];
            qq = q;
            quickSort(qq,count);
        }
        
        //处理middle的右边
        int count2 = n-count-1; //count2表示有count2个数在middle右边,最小为0
        if (count2 > 1)
        {
            double *ww = new double[count2];
            ww = left+1;
            quickSort(ww,count2);
        }
        
    }
    
    
    //折半查找
    void binarySearch(double *p ,int length,double g) {
        bool b = false;
        int left = 1,right = length;
        int middle = (left + right) / 2;
        if (g == p[middle-1])
        {
            cout<<"该数字是第"<<middle<<""<<endl;
        } else {
            while (g != p[middle-1])
            {
                if (left == right)
                {
                    cout<<"该数字不在数组中"<<endl;
                    b = true;
                    break;
                }
                if (g>p[middle-1])   //因为数组从零开始所以减一
                {
                    left = middle + 1;
                } else {
                    right = middle - 1;
                }
                middle = (left + right) / 2;
            }
            if (b == false)
            {
                cout<<"该数字是第"<<middle<<""<<endl;
            }
            
            
        }
    }
    
    
    
    int main() {
        cout<<"请输入数组长度";
        int n;
        cin>>n;
        double *p = new double[n];
        for (int i = 0;i<n;i++)
        {
            cin>>p[i];
        }
        quickSort(p,n);
        for (int xxx = 0;xxx<n;xxx++)
        {
            cout<<p[xxx]<<"    ";
        }
    
    
        cout<<endl<<endl;
        //设(left+right)/2是中间位置
        double g;
        cout<<"输入要查的数字"<<endl;
        cin>>g;
        binarySearch(p,n,g);
        return 0;
    }

    结果如图

  • 相关阅读:
    ffmpeg h264编码 extradata 为空
    MySQL主从复制报错一致性问题解决
    MySQL 子查询优化案例
    RAC+单节点搭建DG
    总结搭建Oracle11g DG踩的坑
    解决开机自动调用脚本失败的问题
    MySQL版本升级之5.6到5.7
    MySQL 通过semi join 优化子查询
    MySQL 配置文件中忘配置default-character-set引发的乱码问题
    MySQL5.6下使用xtrabackup部分备份恢复到MySQL5.7
  • 原文地址:https://www.cnblogs.com/qjqj0-0/p/12543149.html
Copyright © 2011-2022 走看看