zoukankan      html  css  js  c++  java
  • 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("没有找到 ");
        else
            printf("找到了,位置是%d ",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不存在 ",key);
        else
            printf("%d存在,位置%d ",key,res);
        /*递归二分法查询*/
        res = half_find(arr,0,size-1,key);
        if(res == -1)
            printf("%d不存在 ",key);
        else
            printf("%d存在,位置%d ",key,res);
        return 0;
    }

  • 相关阅读:
    Ajax请求参数解释
    下拉菜单:‘点击外面关闭’的解决方案
    nc
    telnet
    arping
    traceroute
    ping
    ss
    netstat
    ip
  • 原文地址:https://www.cnblogs.com/spring-1991/p/3165974.html
Copyright © 2011-2022 走看看