1. 程式人生 > >二分插入排序演算法、二分檢索、隨機數(桂電灕江學堂資料結構C5)

二分插入排序演算法、二分檢索、隨機數(桂電灕江學堂資料結構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;
}