各種基本演算法實現小結(六)—— 尋找演算法
(均已測試通過)
===================================================================
1、簡單尋找
在一組無序數列中,尋找特定某個數值,並返回其位置pos
測試環境:VC 6.0 (C)
#include <stdio.h><br />#include <stdlib.h><br />#include <time.h><br />#define MAX 101<br />void input(int num[])<br />{<br />int i;</p><p>srand((unsigned)time(NULL));<br />for(i=1; i<MAX; i++)<br />num[i]=rand()%100;<br />}<br />void output(int num[])<br />{<br />int i;</p><p>for(i=1; i<MAX; i++)<br />{<br />printf("%5d", num[i]);<br />if(0==i%10)<br />printf("/n");<br />}<br />}<br />int find(int num[], int x)<br />{<br />int i;<br />for(i=1; i<MAX; i++)<br />if(x == num[i])<br />return i;<br />return 0;<br />}<br />void main()<br />{<br />int x, pos, num[MAX];<br />input(num);</p><p>printf("num...: /n");<br />output(num);</p><p>printf("Enter find num: ");<br />scanf("%d", &x);<br />pos=find(num, x);<br />if(pos)<br />printf("OK! %d is found in pos: %d/n", x, pos);<br />else<br />printf("Sorry! %d is not found... in num/n", x);<br />}<br />
運行結果:
==========================================================
2、 折半尋找
在有序數列中,逐步縮小尋找範圍,直至找到或找不到記錄為止
本演算法首先隨機產生100個無序數列,然後利用快速排序演算法排序成有序數列,然後再用折半尋找演算法
說明:本演算法中的排序演算法,可用上一篇排序演算法中的任一種演算法實現,如選擇排序、冒泡排序、快速排序等
測試環境:VC 6.0 (C)
#include <stdio.h><br />#include <stdlib.h><br />#include <time.h><br />#define MAX 101<br />void input(int num[])<br />{<br />int i;</p><p>srand((unsigned)time(NULL));<br />for(i=1; i<MAX; i++)<br />num[i]=rand()%100;<br />}<br />void output(int num[])<br />{<br />int i;</p><p>for(i=1; i<MAX; i++)<br />{<br />printf("%5d", num[i]);<br />if(0==i%10)<br />printf("/n");<br />}<br />}<br />void sort(int num[], int low, int high) /* quick sort */<br />{<br />int l, h;</p><p>if(low<high)<br />{<br />l=low;<br />h=high;<br />num[0]=num[l]; /* save pivot */</p><p>while(l<h)<br />{<br />while(l<h && num[h]>=num[0]) h--;<br />num[l]=num[h];<br />while(l<h && num[l]<=num[0]) l++;<br />num[h]=num[l];<br />}<br />num[l]=num[0]; /* insert pivot */</p><p>sort(num, low, l-1);<br />sort(num, l+1, high);<br />}<br />}<br />int find(int num[], int x, int low, int high)<br />{<br />int mid;</p><p>while(low<=high)<br />{<br />mid=(low+high)/2; /* find is OK */</p><p>if(x==num[mid])<br />return mid;<br />else if(x<num[mid])<br />high=mid-1;<br />else<br />low=mid+1;<br />}<br />return 0;<br />}<br />void main()<br />{<br />int x, pos, num[MAX];<br />input(num);</p><p>printf("sort before... /n");<br />output(num);<br />sort(num, 1, MAX-1);<br />printf("sort after... /n");<br />output(num);</p><p>printf("Enter find num: ");<br />scanf("%d", &x);<br />pos=find(num, x, 1, MAX-1);<br />if(pos)<br />printf("OK! %d is found in pos: %d/n", x, pos);<br />else<br />printf("Sorry! %d is not found... in num/n", x);<br />}<br />
運行結果:
==========================================================
參考推薦:
學習演算法之路
各種基本演算法實現小結(一)—— 鏈 表
各種基本演算法實現小結(二)—— 堆 棧
各種基本演算法實現小結(三)—— 樹與二叉樹
各種基本演算法實現小結(四)—— 圖及其遍曆
各種基本演算法實現小結(五)—— 排序演算法
各種基本演算法實現小結(六)—— 尋找演算法
各種基本演算法實現小結(七)—— 常用演算法
12個有趣的C語言面試題