C语言 二分法查找 排序问题

2024-11-17 16:38:17
推荐回答(1个)
回答1:

a.txt: 读入数据

b.txt: 写入排序数据

c.txt: 写入查找结果

#include 

const int maxn = 1000;
int num[maxn], n;


void swap(int* x,int* y) {
     *x ^= *y;
     *y = *x^*y;
     *x = *x^*y;
}

void finput() {
    printf("--------\nread data from a.txt\n--------\n\n");
    FILE* fin = fopen("a.txt","r");
    n = 0;
    while ( fscanf(fin,"%d",&num[n]) != EOF ) {
          n++;
    }
    fclose(fin);
}


void bubble() {
     printf("--------\nstart bubbling sort algorithm\n");
     for (int i = n-1; i > 0; --i) {
         for (int j = 0; j < i; ++j) {
             if (num[j] > num[j+1]) {
                swap(&num[j],&num[j+1]);
             }
         }
     }
     
     printf("write the result of sort in b.txt\n--------\n\n");
     FILE* fout = fopen("b.txt","w");
     for (int i = 0; i < n; ++i) {
         fprintf(fout,"%d\n", num[i]);
     }
     fclose(fout);
}

int rbesearch(int low,int high,int v) {
    // recursive binary search
    // return the index of v. if not exists, return -1.
    if (low == high) {
       if (num[low] == v) return low;
       return -1;
    }
    if (num[low] == v) return low;
    int mid = (low+high)/2;
    if (num[mid] < v) {
       return rbesearch(mid+1,high,v);
    }
    else {
       return rbesearch(low,mid,v);
    }
}

int nrbesearch(int low,int high,int v) {
    // non-recursive binary search
    // return the index of v. if not exists, return -1. 
    while (low < high) {
          int mid = (low+high)/2;
          if (num[mid] < v) {
             low = mid+1;
          }
          else {
               high = mid;
          }
    } 
    if (low == high && num[low] == v) {
        return low;
    }
    return -1;
}


void search() {
     printf("--------\n");
     printf("Start search.\n");
     printf("The results will be written in c.txt\n");
     printf("please input a num. if num = -123456, quit.\n");
           
     FILE* file=fopen("c.txt","w");
     while (true) {
           int v;
           scanf("%d", &v);
           if (v == -123456) break;
           
           int rb = rbesearch(0,n-1,v);
           int nrb = nrbesearch(0,n-1,v);
           
           fprintf(file,"input: %d\n",v);
           fprintf(file,"the result of recursive binary search: %d\n", rb);
           fprintf(file,"the result of non-recursive binary search: %d\n\n", nrb);
           
           printf("the result of recursive binary search: %d\n", rb);
           printf("the result of non-recursive binary search: %d\n\n",nrb);
     }
     fclose(file);
     
}

int main() {
    finput();
    bubble();
    search();
    return 0;
}