問題分析:
采用二分查找法查找特定關鍵字的元素。要求用戶輸入數組長度,也就是有序表的數據長度,并輸入數組元素和查找的關鍵字。程序輸出查找成功與否,以及成功時關鍵字在數組中的位置。例如,在有序表 10、13、17、 28、39、58、69、88、98、152 中查找關鍵字為88的元素。
算法描述:
(1)首先,從數組的中間元素開始查找,如果該元素正好是目標元素,則搜索過程結束,否則執行下一步。
(2)如果目標元素大于/小于中間元素,則在數組大于/小于中間元素的那一半區域去查找,然后重復步驟(1)的操作。
(3)如果某一步數組為空,則表示找不到目標元素
代碼實現:
#include <stdio.h>
void bubblingSort(int arr[], int n) {
int i, j, temp;
// 每次將一個元素送到末尾,n個元素,執行n次
for (i = 0; i < n; ++i) {
// 之前的循環已經將i個元素送到末尾,不需要再次比較,故減去,因為跟后一個元素比較,為了避免溢出,故減一
for (j = 0; j < n - i - 1; ++j) {
// 如果當前的元素比后一個元素小,就交換
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int binarySearch(int key,int a[],int n) //自定義函數binary_search()
{
int low,high,mid,count=0,count1=0;
low=0;
high=n-1;
while(low<=high) //査找范圍不為0時執行循環體語句
{
count++; //count記錄査找次數
mid=(low+high)/2; //求中間位置
if(key<a[mid]) //key小于中間值時
high=mid-1; //確定左子表范圍
else if(key>a[mid]) //key 大于中間值時
low=mid+1; //確定右子表范圍
else if(key==a[mid]) //當key等于中間值時,證明查找成功
{
printf("查找成功!n 查找 %d 次!a[%d]=%d",count,mid,key); //輸出査找次數及所査找元素在數組中的位置
count1++; //count1記錄查找成功次數
break;
}
}
if(count1==0) //判斷是否查找失敗
printf("查找失敗!"); //査找失敗
return 0;
}
int main()
{
int i,key,arr[100],n;
printf("請輸入數組的長度:n");
scanf("%d",&n); //輸入數組元素個數
printf("請輸入數組元素:n");
for(i=0;i<n;i++)
scanf("%d",&arr[i]); //輸入有序數列到數組a中
printf("排序前:");
for (i = 0; i < n; ++i) {
printf("%d ", arr[i]);
}
bubblingSort(arr,n);//冒泡排序
printf("排序后:");
for (i = 0; i < n; ++i) {
printf("%d ", arr[i]);
}
printf("請輸入你想查找的元素:n");
scanf("%d",&key); //輸入要查找的關鍵字
binarySearch(key,arr,n); //調用二分法查找函數
printf("n");
return 0;
}
運行結果:


我從事互聯網行業幾十年,主要的研究方向是大數據,人工智能,物聯網領域,感興趣的朋友可以關注我,也可以在評論區留言,大家一起交流和溝通。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
發表評論
請登錄后評論...
登錄后才能評論