#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__ */