静态查找的方法简单,现在直接看源代码: #include <stdio.h> #include <stdlib.h> #define NUM 10 /** * 顺序查找,适用范围广,单时间复杂度为O( n/2 ) */ int SeqSearch( int a[], int n ) { int i; for( i = 0; i < NUM; i++ ) { if( n == a[i] ) return i; } return -1; } /** * 该算法与上面同理,只不过安插了一个前哨站 * 减少了一次(i<len)比较,从而减少了运行时间 * 这种巧妙的方法值得借鉴! */ int SeqSearch_gai( int a[], int n ) { int i; a[NUM] = n; //安插前哨站,如果是数组要多申请一个空间 i = 0; while( a[i] != n ) i++; if( i == n ) return -1; else return i; } /** * 冒泡排序 */ int BubbleSort( int a[] ) { int i, j, t; bool bOK = false; for( i = 0; i < NUM-1; i++ ) { bOK = false; for( j = NUM-1; j > 0; j-- ) { if( a[j] < a[j-1] ) { bOK = true; //哨所 t = a[j]; a[j] = a[j-1]; a[j-1] = t; } } if( !bOK ) return 1; } return 1; } /** * 折半查找: 前提是要先排好序的数组,效率极高,复杂度为O((log2(n+1))-1) * 该算法缺点是需要事先对表中的关键字进行排序,而排序花费时间较大 * 故此算法经常用于有序表一旦建立就很少改动且需要查找的线性表中,同 * 时只使用顺序存储结构而不能用于线性链表中. */ int BiSearch( int a[], int n ) { int mid, high, low; low = 0; high = NUM-1; while( low <= high ) { mid = ( low + high ) / 2; if( n == a[mid] ) return mid; if( a[mid] > n ) high = mid -1; else low = mid + 1; } return -1; } /** * 分块查找,把数据分出几块,然后提出每块的关键字 * 这些关键字按一定规则排序,查找的时候就是先从关键字 * 查起,找到对应的块后,查找该块下面的数据,块中的数据 * 可以不按顺序排列,它的复杂度介于顺序查找和折半查找之间 * 但是需要另外申请空间存储关键字部分。 */ int BlockSearch( int a[], int n ) { return -1; } int main( void ) { int a[NUM+1]; int i; for( i = 0; i < NUM; i++ ) { a[i] = rand() % NUM; printf( "%d ", a[i] ); } printf( "/n" ); // i = SeqSearch( a, 1 ); // i = SeqSearch_gai( a, 1 ); BubbleSort( a ); //冒泡排序 i = BiSearch( a, 2 ); if( i >= 0 ) { printf( "所查找位置在: %d/n", i ); } else printf( "没有该数存在/n" ); return 0; }