C语言查找算法

/**

 查找(数组)

 1> 顺序查找 : 就是遍历数组每一个元素同该元素比较,但是问题是效率比较低

 2> 折半查找 : 条件是数组必须是有顺序的

 */

#include <stdio.h>

#define n 2

int main()

{

    // 折半查找

        /*

         思路:将该元素同中间元素比较,如果有则存在,否则,判断该元素在哪半部分,继续查找;

         */

    

    // 任意输入整数x,在有顺序的数组中查找是否有同x值相同的元素

    // 定义输入数据

    int x = -1;

    // 数组array

    int array[10] = {2, 10, 19, 22, 34, 36, 55, 67, 76, 88};

    scanf("%d", &x);

    // 定义开始元素下标start, 尾标end, 中间元素下标mid

    int start = 0;

    int end = 9;

    int mid = (start + end)/2;

    while (array[mid] != x && (end > start)){

          if (x < array[mid]) {         

            end = mid - 1;

        }else{

            

            start = mid + 1;

        }

        mid = (start + end)/2;

    }

    printf("%d\n", mid);

    return 0;

}

 

#include <stdio.h>

#pragma mark 折半查找 前提是该数组为顺序数组,同时折半查找还能用于插入有序数组中得位置,

#pragma mark 当然我们也可以用for循环查找元素,但是效率较低,当面对大量数据有序数据是,折半查找效率比较高

#pragma mark 如果我们面对一些无须的数据时,如果查找一组数据中是否含有某个数据时,可以先排序,然后用折半查找该元素

#pragma mark 折半查找

int zheban_array(int *array, int len, int num)

{

    int start = 0;

    int end = len-1;

    

    // 循环的条件

    while (start<=end) {

        int mid =(start+end)/2;

        if (array[mid]<num) {

            start = mid+1;

        }else if(array[mid]>num){

            end = mid-1;

        }else{

            return mid; // 如果是查找插入元素的话 mid+1就是要插入的位置(查找到存在的插入的元素)

        }

//        mid = (start+end)/2;

    }

    return -1; //如果查找的话,return start 就是要插入的位置(查找插入的不存在的元素)

}

 

#pragma mark 遍历数组

void  printf_array(int *array, int len){

    

    for (int i = 0; i<len; i++) {

        printf("%d\t", array[i]);

    }

    printf("\n");

}

int main()

{

    int array[] = {3, 5, 8, 23, 34, 65, 99};

    int len = sizeof(array)/sizeof(int);

    int n = zheban_array(array, len, 34);

    printf("%d\n", n);

    return 0;

}

 

posted @ 2014-10-12 17:33  _boy  阅读(448)  评论(0编辑  收藏  举报