zoukankan      html  css  js  c++  java
  • 二分法查找、顺序查找

    本实验主要用二分法来查找两个数组中不同的元素

    #include<iostream>
    
    using namespace std;
    
    int* GetAllNotIncluded(int A[], int a_length, int B[], int b_length);
    
    int main()
    {
        int arr1[6] = { 1,2,3,4,5,6, };
        int arr2[3] = { 8, 9, 1 };
    
        int *arr3;
        arr3 = GetAllNotIncluded(arr1, 6, arr2, 3);
    
        for (int i = 0; i<sizeof(arr2)/sizeof(int); i++)
            cout << arr3[i]<<' ';    
        cin.get();   //暂停窗口,没有其他意义
        return 0;
    }
    
    int* GetAllNotIncluded(int A[],int a_length, int B[],int b_length) {  //二分法查找不同的数据    
        int k = 0;
        int *res = new int[];         //声明一个数据指针
        for (int i = 0; i < b_length; i++) {   
            int l = 0;                         
            int r = a_length - 1;
            bool contains = false;
            while (l <= r) {
                int mid = l + ((r - l) >> 1);
                if (A[mid] == B[i]) {
                    contains = true;
                    break;
                }
                if (A[mid] > B[i]) {
                    r = mid - 1;
                }
                else {
                    l = mid + 1;
                }
            }
            if (!contains) {         //存储不相同的数据    
                res[k] = B[i];
                k += 1;            
            }
        }
        return res;
    }

    本实验有两个不足:

    第一没法知道返回的指针数组的大小,导致用了

    这样的表述

    第二在子函数中不能用

    sizeof(A)/sizeof(int)

    来求数组的长度

    例如:

    int* GetAllNotIncluded(int A[], int B[]) {  //二分法查找不同的数据    
        int k = 0;
        int *res = new int[];         //声明一个数据指针
        for (int i = 0; i < sizeof(B)/sizeof(int); i++) {   
            int l = 0;                         
            int r = sizeof(A)/sizeof(int)- 1;
            bool contains = false;
            while (l <= r) {
                int mid = l + ((r - l) >> 1);
                if (A[mid] == B[i]) {
                    contains = true;
                    break;
                }
                if (A[mid] > B[i]) {
                    r = mid - 1;
                }
                else {
                    l = mid + 1;
                }
            }
            if (!contains) {         //存储不相同的数据    
                res[k] = B[i];
                k += 1;            
            }
        }
        return res;
    }

    这样写得出来的A的长度只有1.

    欢迎大神赐教,O(∩_∩)O谢谢。

    优化:

    #include<iostream>
    
    using namespace std;
    
    int* GetAllNotIncluded(int A[], int a_length, int B[], int b_length);
    
    int main()
    {
        int arr1[6] = { 1, 2, 3, 4, 5, 6, };
        int arr2[3] = { 4, 1, 5 };
    
        int *arr3;
        arr3 = GetAllNotIncluded(arr1, 6, arr2, 3);
    
        int ans = 1;
        int End_Flag= 0;
        while (ans)
        {
            ans = arr3[End_Flag];
            End_Flag++;
        } 
        for (int i = 0; i<End_Flag-1; i++)
            cout << arr3[i] << ' ';
        cin.get();   //暂停窗口,没有其他意义
        return 0;
    }
    
    int* GetAllNotIncluded(int A[], int a_length, int B[], int b_length) {  //二分法查找不同的数据    
        int k = 0;
        int *res = new int[];         //声明一个数据指针
        for (int i = 0; i < b_length; i++) {
            int l = 0;
            int r = a_length - 1;
            bool contains = false;
            while (l <= r) {
                int mid = l + ((r - l) >> 1);
                if (A[mid] == B[i]) {
                    contains = true;
                    break;
                }
                if (A[mid] > B[i]) {
                    r = mid - 1;
                }
                else {
                    l = mid + 1;
                }
            }
            if (!contains) {         //存储不相同的数据    
                res[k] = B[i];
                k += 1;
            }
        }
        res[k] = NULL;  //数据帧尾标志
        return res;
    }

     方法2:顺序查找

    #include  <iostream>
    using namespace std;
    
    //顺序查找算法,时间复杂度为O(n),额外空间复杂度为O(1)
    //特点:如果同时有多个命中元素时,只返回最大值;如果查找失败时返回-1
    template <typename T>int find(T e, T arr[], int low, int high)  //C++中模板
    {
        while ((low < high--) && (e != arr[high]));
        
        return high;
        
    }
    
    int main()
    {
        int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        cout << find(5, arr, 0, 9) << endl;
        return 0;
    }
  • 相关阅读:
    Java实现继承过程概述
    Java封装概述
    Java中包的介绍
    Java中final关键字概述
    Java继承概述
    mysql服务自动关闭的解决
    Unity3d碰撞检测中碰撞器与触发器的区别
    解决在Game模式下兼容编辑器模式
    GameObject.Find("")只能查找到显示的对象
    层(layer)的设置
  • 原文地址:https://www.cnblogs.com/panlangen/p/7857591.html
Copyright © 2011-2022 走看看