天天看點

自動生成随機數測試歸并排序

#include<stdio.h>
#include<time.h>
//數組大小
#define N 100
//随機數的最大值
#define max 100
void merge(int a[],int p,int x,int q,int b[]){
    int i = p, r = x + 1, k=p;
    //保證還有數組的元素沒有放入臨時數組B[];
    while(i<=x || r <= q){
        //如果r>q成立就說明i<=x一定成立
        //就說明前面那一段數組還有元素沒有比較到那時後面那一段數組已經沒有元素了
        //如果是r>q不成立就說明r<=q成立如果 if裡面的i<=x也成立
        //就說明兩段數組都還有元素是以就需要在IF裡面比較元素的大小
        if((r > q)||(i <= x &&a[i] <= a[r])){
            b[k++] = a[i++];
        }else{
            b[k++] = a[r++];
        }
    }
    int j;
    //将B數組重新放入A數組
    for(j = p;j <=q;j++)
        a[j] = b[j];
}
void mergeSort(int a[],int p,int q,int b[]){
        if(p<q){
        //将數組平均分為兩段
        int x=(q + p)/2;
        //遞歸
        mergeSort(a,p,x,b);
        mergeSort(a,x+1,q,b);
        merge(a,p,x,q,b);
        }
}
int main(){
    srand((unsigned int)time(NULL));
    int i;
    int a[N],b[N];
    printf("随機産生的N個随機數為:\n");
    for(i = 0; i< N; i++){
        a[i] = rand()%max+1;
        printf("%d ",a[i]);
    }
    mergeSort(a,0,N,b);
    printf("\n排好序的N個數為:\n");
    for(i = 0; i< N; i++){
        printf("%d ",a[i]);
    }
    return 0;
}