快速查找算法之为ID卡而生


#include "binary_search.h"
//sort_desc_t sort_desc;
//general version o(log2^n) < o(n)
int binary_search1(u32 *array, u32 value, u16 num){
    u16 low, high, mid;
    low = 0;
    high = num-1;
    while(low<high){
        mid = (low+high)/2;
        if(array[mid] == value)
            return 1;
        if(array[mid] > value)
            high = mid-1;
        if(array[mid] < value)
            low = mid+1;
    }
    return -1;
}


// recursion version
int binary_search2(u32 *array, u32 value, u16 low, u16 high){


    u16 mid = low+(high-low)/2;
    if(array[mid] == value)
        return 1;
    if(array[mid] > value)
        return binary_search2(array,value,low, mid-1);
    if(array[mid] < value)
        return binary_search2(array,value,mid+1,high);
}
// o(log2^(log2^n)) 
int insertion_search(u32 *array, u32 value, u16 low, u16 high){
    u16 mid = low+(float)(value-array[low])/(array[high]-array[low])*(high-low);
    if(array[mid] == value)
        return 1;
    if(array[mid] > value)
        return insertion_search(array,value,low,mid-1);
    if(array[mid] < value)
        return insertion_search(array,value,mid+1,high);


}


//快速排序
/*left,.,.,.,.,right*/
void quick_sort(u32 *array, u16 left, u16 right){
    if(left < right){
        u16 i=left, j=right, x = array[i];
        while(i<j){
            while(i<j && array[j]>=x)
                j--;
            if(i < j)
                array[i++]=array[j];
                    
            while(i<j && array[i]<x)
                i++;
            if(i < j)
                array[j--]=array[i];
        }
        array[i] = x;
        quick_sort(array, left, i-1);
        quick_sort(array, i+1, right);
    
    }
}


//插入排序 适合与已存在三张有序卡
/* num>=1  There is at least one initial value*/
int binary_insert_sort(u32 *array, u32 insert_val, u16 num){
//    if(num == 0)
//        num=1;
    u16 low, high, mid,j;
    low = 0;
    high = num-1;
    if(insert_val <= array[low]){
        int k=num-1;
        while(k>=0){
            array[k+1]=array[k];
            k--;
        }
        array[0]=insert_val;
        return 1;
    }else if(insert_val >= array[high]){
        array[high+1]=insert_val;
        return 1;
    }
//Find the interval of the inserted value (three data)
    while(low<(high-2)){ 
        mid = (low+high)/2;
//        if(array[mid] == value)
//            return 1;
        if(array[mid] > insert_val)
            high = mid;  //            high = mid-1;
        if(array[mid] < insert_val)
            low = mid;   //            low = mid+1;
    }
    j = num-1;
    if(insert_val<array[low+1]){
        while(j>low){
           array[j+1]=array[j];  
           j--; 
        }
        array[low+1] = insert_val;
    }else if(insert_val>array[low+1]){
        while(j>low+1){
            array[j+1]=array[j];
            j--;
        }
        array[low+2] = insert_val;
    }
    return 1;

}



#ifndef __BINARY_SEARCH_H__
#define __BINARY_SEARCH_H__


#include <math.h>
#include <stdlib.h>


typedef unsigned char    u8;
typedef unsigned short   u16;
typedef unsigned int     u32;
typedef unsigned int     card_t; 
/*
typedef __packed struct _sort_flag_t{
    u8 sort_flag:1;             //表示数组是否已经排序完成,0:未;1:已
    
    
}sort_flag_t;


typedef __packed struct _sort_desc_t{
    u16 array_num;              // array current number
    u16 array_len;              // array total length
    u32 min_val;
    u32 max_val;
    
}sort_desc_t;
*/
int binary_search2(u32 *array, u32 value, u16 low, u16 high);
int insertion_search(u32 *array, u32 value, u16 low, u16 high);
void quick_sort(u32 *array, u16 left, u16 right);
int binary_insert_sort(u32 *array, u32 insert_val, u16 num);
#endif /* end of __BINARY_SEARCH_H__ */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值