在嵌入式开发中,可以使用c标准库自带的库函数,而不用自己去早轮子,qsort 和bsearch就是其中的两个比较好用的
二分法查找,前提是已经排序好的数据。下面的代码, 如果数据为排序,则要进行排序后,再查找。
代码语言:javascript复制/* bsearch example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort, bsearch, NULL */
int compareints (const void *a, const void *b)
{
return ( *(int *)a - * (int *)b );
}
int values[] = { 50, 20, 60, 40, 10, 30 };
int main ()
{
int *pItem;
int key = 45;
qsort (values, 6, sizeof (int), compareints);
pItem = (int *) bsearch (&key, values, 6, sizeof (int), compareints);
if (pItem != NULL)
printf ("%d is in the array.n", *pItem);
else
printf ("%d is not in the array.n", key);
return 0;
}
快速排序
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
int values[] = { 88, 56, 100, 2, 25 };
int cmpfunc (const void *a, const void *b)
{
return ( *(int *)a - * (int *)b ); //升序
//return ( *(int *)a - * (int *)b ); //降序
}
int main()
{
int n;
printf("排序之前的列表:n");
for ( n = 0 ; n < 5; n )
{
printf("%d ", values[n]);
}
qsort(values, 5, sizeof(int), cmpfunc);
printf("n排序之后的列表:n");
for ( n = 0 ; n < 5; n )
{
printf("%d ", values[n]);
}
return (0);
}
比较函数需要特别注意~~~~
Pointer to a function that compares two elements. This function is called repeatedly by qsort to compare two elements. It shall follow the following prototype:
代码语言:javascript复制int compar (const void* p1, const void* p2);
Taking two pointers as arguments (both converted to const void*). The function defines the order of the elements by returning (in a stable and transitive manner):
return value | meaning |
---|---|
<0 | The element pointed to by p1 goes before the element pointed to by p2 |
0 | The element pointed to by p1 is equivalent to the element pointed to by p2 |
>0 | The element pointed to by p1 goes after the element pointed to by p2 |
For types that can be compared using regular relational operators, a general compar function may look like:
代码语言:javascript复制int compareMyType (const void * a, const void * b)
{
if ( *(MyType*)a < *(MyType*)b ) return -1;
if ( *(MyType*)a == *(MyType*)b ) return 0;
if ( *(MyType*)a > *(MyType*)b ) return 1;
}