C語(yǔ)言巧用二分查找實(shí)現(xiàn)猜數(shù)游戲
?? 文章Gitee倉(cāng)庫(kù):文章源代碼
(壹)二分查找
?? 1.1 何為二分查找
折半查找,也稱二分查找,在某些情況下相比于順序查找,使用折半查找算法的效率更高。但是該算法的使用的前提是靜態(tài)查找表中的數(shù)據(jù)必須是有序的。
例如,在{5,21,13,19,37,75,56,64,88 ,80,92}這個(gè)查找表使用折半查找算法查找數(shù)據(jù)之前,需要首先對(duì)該表中的數(shù)據(jù)按照所查的關(guān)鍵字進(jìn)行排序:{5,13,19,21,37,56,64,75,80,88,92}。
?? 1.2 二分查找的原理
以升序數(shù)列為例,比較一個(gè)元素與數(shù)列中的中間位置的元素的大小,如果比中間位置的元素大,則繼續(xù)在后半部分的數(shù)列中進(jìn)行二分查找;如果比中間位置的元素小,則在數(shù)列的前半部分進(jìn)行比較;如果相等,則找到了元素的位置。每次比較的數(shù)列長(zhǎng)度都會(huì)是之前數(shù)列的一半,直到找到相等元素的位置或者最終沒有找到要找的元素。
動(dòng)圖演示:(于順序查找相比較)
?
?? 1.3 查找條件
二分查找的前提條件是有序數(shù)列,普通查找則不需要。
查找到返回該元素的下標(biāo),否則返回-1。
普通查找的時(shí)間復(fù)雜度為O(N), 二分查找的時(shí)間復(fù)雜度為O(logN)。 N/2/2···/2=1,2^m=N(m為折半查找的次數(shù)),那么m=log(N),二分查找的時(shí)間復(fù)雜度就為O(logN)。
?? 1.4 代碼實(shí)現(xiàn)
?? 1.4.1 初始化數(shù)據(jù)
?? 1.4.2 核心函數(shù)
(貳)猜數(shù)字游戲
?? 2.1 菜單初始化
?? 2.2 核心函數(shù)
?? 2.3 main函數(shù)
?? 2.4 總代碼
#include <stdio.h> #include <time.h> #include <stdlib.h> void menu() { printf("**********************************\n"); printf("*********** 1.play ***********\n"); printf("*********** 0.exit ***********\n"); printf("**********************************\n"); } //RAND_MAX--rand函數(shù)能返回隨機(jī)數(shù)的最大值。 void game() { int random_num = rand() % 100 + 1; int input = 0; while (1) { printf("請(qǐng)輸入猜的數(shù)字>:"); scanf("%d", &input); if (input > random_num) { printf("猜大了\n"); } else if (input < random_num) { printf("猜小了\n"); } else { printf("恭喜你,猜對(duì)了\n"); break; } } } int main() { int input = 0; srand((unsigned)time(NULL)); do { menu(); printf("請(qǐng)選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("選擇錯(cuò)誤,請(qǐng)重新輸入!\n"); break; } } while (input); return 0; }
到此這篇關(guān)于C語(yǔ)言巧用二分查找實(shí)現(xiàn)猜數(shù)游戲 的文章就介紹到這了,更多相關(guān)C語(yǔ)言 二分查找內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vs2022?qt環(huán)境搭建調(diào)試的方法步驟
最近net6和vs2022發(fā)布,本文就詳細(xì)的介紹一下vs2022?qt環(huán)境搭建調(diào)試的方法步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C語(yǔ)言 一級(jí)指針與二級(jí)指針詳細(xì)介紹
這篇文章主要介紹了C語(yǔ)言 一級(jí)指針與二級(jí)指針詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10C++強(qiáng)制轉(zhuǎn)換與智能指針示例詳解
這篇文章主要介紹了C++強(qiáng)制轉(zhuǎn)換與智能指針示例,智能指針(Smart Pointer)是一種抽象的數(shù)據(jù)類型。在程序設(shè)計(jì)中,它通常是經(jīng)由類模板來實(shí)現(xiàn),借由模板來達(dá)成泛型,借由類別的析構(gòu)函數(shù)來達(dá)成自動(dòng)釋放指針?biāo)赶虻拇鎯?chǔ)器或?qū)ο?/div> 2022-11-11零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文2020-06-06C++實(shí)現(xiàn)LeetCode(110.平衡二叉樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(110.平衡二叉樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07最新評(píng)論