財神娛樂首存即享優惠回饋唷~詳情請進👉

【數據布局】5.1 次序表的大博弈查找和二分查找的完成

類的布局以下:

class StaticSearchTable {
private:
    int *data;
    int data_number;
    bool search_seq(int loc,int key);
    void select_sort();
    bool flag;//區別是否為次序表
    
public:
    StaticSearchTable(int n,bool flag);
    int Search_Seq(int key);//次序查找
    int Search_Bs(int key);//折半查找(條件是必需是有序表)
    void print();
};

類的組織函數,這里參加了一個標記flag用來區別要創立的是次序表仍是無序表(有序表即履行一次選擇排序)

StaticSearchTable::StaticSearchTable(int n,bool flag)
{
    this->flag = flag;
    srand(time(NULL));
    //n為數組元素個數,然則0是不寄存數值的故data空間要多開一個
    data = new int[n + 1];
    for (int i = 0; i < n; i++)
    {
        data[i + 1] = rand()%100;//0~99
    }
    data_number = n + 1;
    if (flag)
    {
        select_sort();
    }
    
}

二分法查找:

int StaticSearchTable::Search_Bs(int key)
{
    
    //配置三個變量low,mid,high保管數組的最先中間以及末尾的序號
    int low = 1;
    int high = data_number;
    int result = 0;
    /*1.若是序號為mid的數組元素的值與x相等,相稱于查找到了數據,返歸mid
      2.若是x<a[mid],透露表現要查找的數據x位于low與mid-1序號之間
      就不必要再往查找mid與high序號之間的元素了。是以將high變量的值改成mid-1,從新查找low與mid-1(即high變量的新值)之間的數據
    3.若是x>a[mid],透露表現要查找的數據x位于mid+1與high序號之間,就不必要再往查找low
      與mid序號之間的元素了。是以,將low變量的值改成mid+1,從新查找mid+1(即low變
      量的新值)與high之間的數據
    4.慢慢輪回,若是到low>high時還未找到方針數據x,則透露表現數組中無此數據*/
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (data[mid] == key)
        {
            result = mid;
            break;
        }
        else if (key < data[mid])
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }
    return result;
}

間接查找,引入尖兵機制,淘汰判定次數:

int StaticSearchTable::Search_Seq(int key)
{
    int i;
    data[0] = key;//尖兵,判定是否已經經實現整個次序表的遍歷操作
    for (i = data_number; !search_seq(i,key); i--);//從后去前查找
    return i;//i若返歸0即查找掉敗
}

一切查找若是掉敗都是返歸0,在主函數代碼中加一個判定即可

上面給出菜單設計:

第一層菜單

void menu()//摹擬菜單選項
{
    cout << 公眾 ------------------------------------------------------公眾 << endl;
    cout << 公眾 |       1____________無序次序表查找                  |"大眾 << endl;
    cout << 公眾 |       2____________有序次序表查找                  |"大眾 << endl;
    cout << 公眾 |       0____________退出體系                        |"大眾 << endl;
    cout << "大眾 ------------------------------------------------------"大眾 << endl;
}

View Code

第二層菜單

void SortedMenu()//有序次序表摹擬菜單選項
{
    cout << "大眾 ------------------------------------------------------"大眾 <&妞妞算牌lt; endl;
    cout << 公眾 |       1____________有序次序查找                    |公眾 << endl;
    cout << "大眾 |       2____________有序折半查找                    |"大眾 << endl;
    cout << "大眾 |       0____________返歸                            |公眾 << endl;
    cout << "大眾 ------------------------------------------------------"大眾 << endl;
}

View Code

總測試函數(經由過程switch case 以及逝世輪回來完成,最初的return 0和 system(pause)可以刪往,由于按0間接是exit(0))

int main()
{

    while (1)
    {
        menu();
        int select;
        cout << "大眾請輸出您的選擇:"大眾;    
        cin >> select;
        switch (select)
        {
        case 1:    //無序次序表查找
        {    
            cout << 公眾請輸出無序表中的元素個數:"大眾;
            int n;
            cin >> n;
            StaticSearchTable L(n,false);
            L.print(真錢麻將app);//輸入發生的無序表的元素
        while (1)
        {
            cout << "大眾請輸出待查找的樞紐字:"大眾;
            int k;
            cin >> k;
            int result = L.Search_Seq(k);
            if (result > 0)
                cout << "大眾查找勝利,為第"大眾 << result << "大眾個元素."大眾 << endl;
            else
                cout << "大眾查找掉敗,沒無關鍵字為"大眾 << k << "大眾的元素."大眾 << endl;
            char finish;
            cout << 公眾持續查找嗎?(y/n)"大眾;
            cin >> finish;
            if (finish == ‘n‘ || finish == ‘N‘)
                break;
        }
        break;
     六合彩金額算法   }
        case 2://有序次序表查找
        {
            
            cout << "大眾請輸出有序表中的元素個數:"大眾;
            int n;
            cin >> n;
            StaticSearchTable L(n,true);
            L.print();//輸入發生的有序表的元素
            SortedMenu();//有序次序表查找選項菜單
            while (1)
            {
                int subSelect;
                cout << "大眾請輸出選擇:公眾;
                cin >> subSelect;
                if (subSelect == 0)//返歸上一級
                    break;
                int k;
                cout << "大眾請輸出待查找的樞紐字:"大眾;
                cin >> k;
                int result;
                if (subSelect == 1)
                    result = L.Search_Seq(k);//有序次序查找
                else if (subSelect == 2)
                    result = L.Search_Bs(k);//折半查找
                else
                {
                妞妞牌型    cout << "大眾選擇過錯,請從新輸出!"大眾 << endl;
                    continue;
                }
                if (result > 0)
                    cout << 公眾查找勝利,為第"大眾 << result << "大眾個元素."大眾 << endl;
                else
                    cout << 公眾查找掉敗,沒無關鍵字為"大眾 << k << "大眾的元素."大眾 << endl;
            }
            break;
        }
        case 0:
            exit(0);
        default:
            cout << 公眾您輸出的選項有誤,請從新輸出:"大眾;
        }
    }
    system(公眾pause公眾);
    return 0;
}

View Code

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我地下運彩ptt私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。