C语言 算法之查找与排序

线性查找

从头开始一个一个的数据进行比较,找到需要的数据。无序的数组,只能用线性查找。

算法复杂度O(N);

/*线性查找*/
#include<stdio.h>

int line_find(int data[],int size,int key){
    int i;
    for(i = 0; i < size; ++i){
        if(key == data[i])
            return i;
    }
    return -1;
}

int main(){
    int arr[] = {13,45,21,37,49,19};
    int size = sizeof(arr)/sizeof(arr[0]);  //求数组元素个数
    int key = 37;
    int res = line_find(arr,size,key);
    if(res == -1)
        printf("没有找到\n");
    else
        printf("找到了,位置是%d\n",res);
}

二分查找

在使用二分查找之前要确认数组是有序的。假如数组是升序的,取数组的中间值data[mid]和需要查找的key值,进行比较。

如果key值大于data[mid],则再从从mid+1到尾端的中间值(key小于data[mid],则取开头到mid-1),与key比较,依次类推。

直到结束,如果依然没有匹配的数据则证明数组中没有要查找的值,返回-1.否则返回下标i。

算法复杂度O(logN).

注意:二分法查找的数组必须是有序的。

/*******************************************
 *                                                     *
 * 二分法查找,前提条件被查找的数组是有序的      *
 *                                                     *
 * *****************************************/

#include<stdio.h>

/*一般二分法查找*/
int half_find(int data[],int left,int right,int key){
    while(left <= right){
        int mid = right + left;
        if(key < data[mid])
            right = mid -1;
        else
            if(key > data[mid])
                left = mid + 1;
            else
                return mid;
    }
    return -1;
}

/*递归二分法*/
int recurrence_half_find(int data[], int left,int right, int key){
    if(left <= right){
        int mid = (right + left)/2;
        if(key < data[mid])
            return recurrence_half_find(data,left,mid - 1,key);
        else
            if(key > data[mid])
                return recurrence_half_find(data,mid + 1,right,key);
            return mid;
    }
    return -1;
}
int main(){
    int arr[] = {13,19,21,37,45,49};
    int size = sizeof(arr)/sizeof(arr[0]);
    int key = 37;
    /*一般二分法查询测试*/
    int res = half_find(arr,0,size-1,key);
    if(res == -1)
        printf("%d不存在\n",key);
    else
        printf("%d存在,位置%d\n",key,res);
    /*递归二分法查询*/
    res = half_find(arr,0,size-1,key);
    if(res == -1)
        printf("%d不存在\n",key);
    else
        printf("%d存在,位置%d\n",key,res);
    return 0;
}

posted @ 2013-07-01 22:25  SpringJiang  阅读(308)  评论(0编辑  收藏  举报