查找(无序线性、有序线性、二分查找)
如何在数组上实现查找?(C语言版)
一、实验内容:
1.编写各种查找方法的基本操作函数。
2.调用编写好的函数实现下列操作:
(1)在给定的数组 E[N]={213,111,222,77,400,300,987,1024,632,555}中,调用无序线性表的顺序查找函数进行查找;
(2)调用有序线性表的顺序查找函数进行查找;
(3)调用二分法查找函数进行查找。
二、实现代码:
实验过程:(实验步骤、数据记录及处理)
源代码:
#include<stdio.h>
#include<conio.h>
#define N 10
int E[N] = { 213, 111, 222, 77, 400, 300, 987, 1024, 632, 555 };void s_sort( int e[], int n ) /* e:存储线性表的数组 n:线性表的结点个数 */
{int i, j, k, t;for( i = 0; i < n-1; i++ ) { /* 控制n−1趟的选择步骤 *//* 在e[i], e[i+1],...,e[n-1]中选键值最小的结点e[k] */for( k = i, j = i + 1; j < n; j++ )if( e[k] > e[j] )k = j;if( k != i ) { /* e[i]与e[k]交换 */t = e[i];e[i] = e[k];e[k] = t;}}
}int search1( int *k, int n, int key ) /* 无序线性表的顺序查找 */
{int i;for( i = 0; i < n && key != k[i]; i++ );return( i<n ? i : -1 );
}int search2( int *k, int n, int key ) /* 有序线性表的顺序查找 */
{int i;for( i = 0; i < n && key > k[i]; i++ );if( i < n && k[i] == key )return i;return -1;
}
int bin_search( int *k, int n, int key ) /* 二分法查找 */
{int low=0, high=n-1, mid;while( low <= high ) { /* 查找范围下界不大于上界 */mid = ( low + high ) / 2; /* 取有序列的中间元素值 */if( key == k[mid] )return mid; /* 找到键值 */if( key > k[mid] ) /* 键值可能在中值和上界之间 */ low = mid + 1;elsehigh = mid - 1;}return -1;
}void main()
{int i, j;printf( "初始数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );printf( "\n输入要查找的关键码" );scanf( "%d", &i );if( ( j = search1( E, N, i ) ) >= 0 )printf( "找到关键字, 位置为%d\n", j+1 );elseprintf( "找不到\n" );getch();s_sort( E, N );printf( "\n顺序排序后数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );printf( "\n输入要查找的关键字" );scanf( "%d", &i );if (( j = search2( E, N, i ) ) >= 0 )printf( "找到关键字, 位置为%d\n", j+1 );elseprintf( "找不到\n" );getch();printf( "\n输入要查找的关键字" );scanf( "%d", &i );if( ( j = bin_search( E, N, i ) ) >= 0 )printf( "找到关键字, 位置为%d\n", j+1 );elseprintf( "找不到\n" );getch();
}
三、运行结果


