二分插入排序演算法、二分檢索、隨機數(桂電灕江學堂資料結構C5)
請編寫程式使用二分插入排序演算法對隨機資料進行降序排序,並對排序後的序列進行二分查詢操作,要求:
(1) 待排序的資料是計算機隨機生成的 50 個隨機數;
(2) 實現二分插入排序演算法,並輸出排序後的結果;
(3) 實現二分檢索演算法,成功返回 1,否則返回 0;
(4) 統計二分檢索演算法比較的次數;
程式碼:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void erfeninsert(int a[],int );
int erfensearch(int num,int a[],int );
int main(){
srand((unsigned)time(NULL));
int N=10,i,num;
int a[N];
for(i=0;i<N;i++)
a[i]=rand();
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");//輸出產生的隨機數
erfeninsert(a,N);//排序
printf("請輸入需要查詢的數:");
scanf("%d",&num);
if(erfensearch(num,a,N)) printf("查詢成功!");
else printf("查詢失敗!");
return 0;
}
void erfeninsert(int a[],int N){
int i,j,temp,left,right,mid;
for(i=1;i<N;i++){
temp=a[i];
left=0;right=i-1;
while(left<=right){
mid = (left+right)/2;
if(temp>a[mid]) right = mid-1;
else left = mid+1;
}
for(j=i-1;j>=left;j--)
a[j+1] = a[j];
if(i!=left) a[left]=temp;
}
for(i=0;i<N;i++){
if(i%10==0&&i!=0) printf("\n");
printf("%d ",a[i]);//輸出排序後的數
}
printf("\n");
}
int erfensearch(int num,int a[],int N){
int left,right,mid,k=0;
left=0; right=N-1;
while(left<=right){
k++;
mid=(left+right)/2;
if(num ==a[mid]) {
printf("搜尋%d比較次數:%d\n",num,k);
return 1;
}
else if(num<a[mid]) left = mid+1;
else right=mid-1;
}
printf("搜尋%d比較次數:%d\n",num,k);
return 0;
}