1. 程式人生 > >二分查詢遞迴和非遞迴實現(c語言實現)

二分查詢遞迴和非遞迴實現(c語言實現)

#include<stdio.h>++
int seeqSearch(int a[],int n,int k){
    int i=n-1;
    for(;i>=0;i--){//遍歷陣列
        if(a[i]==k){//找到對應的陣列
            return i;//返回該陣列的下標
        }
    }
    return -1;//失敗返回值為-1
}
int  binSearch(int a[],int n,int k){
    int mid,hig,low;//定義指向中間高位和low的元素
    hig=n-1;//為高位指標賦初值
    low=0;//地位賦初值
    while(low<=hig){//到low大於hig時代表未找到退出迴圈
        mid=(hig+low)/2;//為mid賦值
        if(a[mid]==k){
            return mid;//當找到到的時候返回該數的下標
        }
        else if(a[mid]>k){//如果當前的數的值大於k
            hig=mid-1;//當前的mid-1賦值給hig
        }
        else if(a[mid]<k){//如果當前的數的值小於k
            low=mid+1;//當前的mid+1賦值給low
        }


    }
    return -1;//失敗返回-1
}
int  binSearch2(int a[],int low,int hig,int k){//此方法為遞迴演算法
    int mid;//定義指向中間的指標
    if(low>hig){
        return -1;
    }else{
        mid=(hig+low)/2;//為mid賦值
        if(a[mid]==k){
            return mid;//當找到到的時候返回該數的下標
        }
        else if(a[mid]>k){//如果當前的數的值大於k
            binSearch2(a,low,mid-1,k);//呼叫遞迴演算法
        }
        else if(a[mid]<k){//如果當前的數的值小於k
            binSearch2(a,mid+1,hig,k);//呼叫遞迴演算法
        }
    }
}
int main(){
    int a[10001];//定義一個數組用來存放元素
    int n,i=0;//定義一個存放個數和計數器
    printf("請輸入你要輸入的元素的個數:");
    scanf("%d",&n);
    while(n--){
        printf("\n這是你要存入的第%d個元素:\n",i+1);
        scanf("%d",&a[i]);
        i++;
    }
    n=i;
    printf("請輸入你要查詢的元素的數值:\n");
    int k;
    scanf("%d",&k);
    i=seeqSearch(a,n,k);//首先是進行順序查詢得到下標
    if(i==-1){//當返回值為-1代表沒有查到
        printf("你撥打的使用者不在伺服器,請稍後在撥!!!\n");
        return 0;
    }
    printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
    i=binSearch(a,n,k);//其次是進行二分查詢得到下標
    printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
    i=binSearch2(a,0,n-1,k);//遞迴演算法
    printf("查詢到的元素是第%d個\n",i+1);//列印輸出得到的下標的數
    return 0;
}

相關推薦

二分查詢實現c語言實現

#include<stdio.h>++ int seeqSearch(int a[],int n,int k){     int i=n-1;     for(;i>=0;i--){//遍歷陣列         if(a[i]==k){//找到對應的陣列

連結串列的插入刪除操作詳解C語言實現+詳解註釋

連結串列的基本操作中,連結串列結點的插入和刪除相對比較複雜,需根據結點插入位置的不同,使用合理的方法在不破壞原連結串列結構的前提下將其插入到連結串列中。 本節將詳解介紹這兩種操作的具體實現方法,讀者只需牢記實現步驟,即可輕鬆解決這兩大難點。 連結串列中插入結點 連結串列中插入結點,根據插入位置的不同,可

輸入一串字元,並判斷其中英文字元數字字元的個數——C語言實現C語言練習

先看程式執行的結果,(文末有該程式的完整程式碼)   1、先寫好框架 #include<stdio.h> void main() { } 2、再定義所需要的變數 char str;//定義一個字元型變數 str int i=0,counte

最短路徑Dijkstar演算法Floyd演算法詳解c語言

轉載請註明出處:http://blog.csdn.net/crescent__moon/article/details/16986765 先說說Dijkstra吧,這種演算法只能求單源最短路徑,那麼什麼是單源最短路徑呢?就是隻能求一個點到別的點最短路徑,而不能求所有點到其它

二叉查詢樹的簡單實現C語言

老司機不多說,直接上程式碼 標頭檔案: #ifndef BINARYTREE_FIND_H_INCLUDED #define BINARYTREE_FIND_H_INCLUDED struct TreeNode; typedef struct Tr

JAVA實驗二:編碼實現一個類對輸入陣列的數從小到大排序同時使用二分查詢某一個數

編碼實現一個類 (1)提供一個靜態方法,可以將輸入的一個int[]陣列按照從小到大的順序排列; (2)提供靜態方法,對排好序的陣列使用折半(二分)查詢(使用遞迴和非遞迴兩種形式分別實現)查詢某一個整數。 答案 import java.util.*; public class

二分查詢(C++)+演算法

關於二分查詢法 二分查詢法主要是解決在“一堆數中找出指定的數”這類問題。 而想要應用二分查詢法,這“一堆數”必須有一下特徵: 儲存在陣列中 有序排列 所以如果是用連結串列儲存的,就無法在其上應用二分查詢法了。(曽在面試被問二分查詢法可以什麼資料結構上使用:陣列?連結

Java二分查詢演算法實現,分別使用方式

public class BinarySearch { private int[] array; private int index; private int min; private int max; public BinarySearch(int[]

二分查詢 java實現

public static int rank(int []a , int x, int lo, int hi) { if(hi<lo) return -1; if(a[lo+(hi-lo)/2]>x) return rank(a,x,lo,lo+(hi-lo)/2-1);

二分查詢實現

二分查詢法:      二分查詢法又稱折半查詢法,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。(借鑑百度百科)時間複雜度為:log2n,即log以2為底,n的對數。     

資料結構用方法實現二分查詢

       二分查詢法說的通俗一點就是折半查詢,每查詢一次,所對應的元素就會減少一半,所以這種方法的優點就是比較的次數少,查詢的速度快。但其最大的缺點就是插入資料比較困難。所以在面對資料一直會發生變動的列表,就不推薦用二分查詢法了。        那麼下面就來實際介紹一下

C語言實現二分查詢

二分查詢是將有序數列不斷地縮小,直到找到改元素或折半區域的首元素位置高於尾元素位置為止。//遞迴寫二分查詢 int BinarySearchD(int arr[], int x, int begin,

練習題013:二分查詢兩種方法

題目:用遞迴和非遞迴兩種方法實現二分查詢 非遞迴法: int binary_search(int *arr, int lenth, int key) { assert(arr != NU

演算法--查詢演算法順序查詢二分查詢方式

我們拋開二分查詢演算法,如果有這樣的一個需求,需要在一些數字中找出有沒有某個數字,我們應該怎麼做?          1 首先我們會想到用什麼資料結構存放這些數? 資料結構就是計算機儲存組織、

楊氏矩陣查詢數字

楊氏矩陣  有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 要求:時間複雜度小於O(N);  例:  1 2 3          4 5 6  

[C語言]用的方法在楊氏矩陣中查詢

從楊氏矩陣中查詢數字,以及調整奇數位於陣列的前半部分 //從楊氏矩陣中查詢數字 //1.從右上角開始找,如果要找的值大於當前值,向下找,否則,向左找,方向確定 //2.從左下角開始找,如果要找的值大於當前值,向右找,否則,向上找,方向確定 //---->最

折半查詢法的形式

/* 1、折半查詢的查詢過程是:先確定待查記錄所在區間,然後逐步縮小範圍至到找到或者找不到該記錄為止。2、折半查詢的效能分析可以由判定樹得出,折半查詢在查詢成功時給定值進行比較的關鍵字個數至多為⌊log_2 ⌋ */ //折半查詢法的非遞迴形式 int Search_Bin

一列數字的規則如下;1,1,2,3,5,8,13,21,34........ 求第30位數字是多少,用兩種方法演算法實現

斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非

二叉樹的前序,中序,後序的遍歷的程式碼-C語言

#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l

二叉樹的前中後序遍歷版本

各位讀者週末愉快呀,今天我想來說說一道很常見的面試題目 —— 關於二叉樹前中後序遍歷的實現。本文將以遞迴和非遞迴方式實現這 3 種遍歷方式,程式碼都比較短,可以放心食用。 先簡單說明一下這 3 種遍歷方式有什麼不同 —— 對於每種遍歷,樹中每個結點都需要經過 3 次(對於葉結點,其左右子樹視為空子樹),但前