C语言用qsort写一个快速排序程序

编写一个C语言的程序,程序能将一个文档中的一串无序整数读取,并利用qsort函数将其升序在屏幕上排列显示。之后利用bsearch函数判断,任给一个整数a,a是否在已升序排列的整数序列中。请注意以下要求:
1、读取文件函数duwenjian在最后已给出。文件名paixu的格式为:第一行代表数组中数字的个数,第二行为一串无序数组。例如:第一行:7,第二行:-2 8 42 9 76 1 30。
2、程序中使用的数组A最多为10000位,请用malloc与free函数执行此条件。
3、程序中需包含比较函数int bijiao_int(const void *l, const void *r),函数可以比较两个数*l,*r是否满足*l<*r,或*l==*r,或*l>*r,相应回传为-1,0,1

读文件函数duwenjian如下,其中的10000请用malloc和free函数执行

int duwenjian(char *paixu, int A[], int *lang)
{
FILE *file;
int i;
file=fopen(paixu, "r");
if (file==NULL) {
fprintf(stderr, "文档 %s 打开失败.\n", paixu);
return -1;
}
fscanf(file, "%d", lang);
if (*lang>10000) {
fprintf(stderr, "文档%s中的数字过多,至多只允许10000位.\n",
paixu);
return -1;
}

for (i=0; i<*lang; i++) {
fscanf(file, "%d", &(A[i]));
}
return 0;
}
读取文件函数(duwenjian)将文件名为“paixu(排序)”的文件打开,并将其第二行内容依次写入数组A,其第一行内容为数组中数的个数,将其记录于lang中。若执行失败则返回-1,成功则返回0.

我的文件路径"c:\\list.txt",里面测试数据就是你举例的:第一行:7,第二行:-2 8 42 9 76 1 30。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int num[100];
int cmp ( const void *a , const void *b );//qsort的子函数
int compare(const void *p, const void *q);//bsearch的子函数

int duwenjian(char *paixu, int A[], int *lang);

int main()
{
    char paixu[]="c:\\list.txt";
    int lang,*a=NULL,i,n,*isFouund=NULL;
    a=(int *)malloc(sizeof(int)*10000);
    if(duwenjian(paixu,a,&lang)==-1)
        exit(1);
    qsort(a,lang,sizeof(a[0]),cmp);
    printf("从文件中读取数组并升序排列打印为:");
    for(i=0;i<lang;i++)
        printf("%d ",a[i]);
    while(1)
    {
        printf("\n输入要查找的数字:");
        scanf("%d",&n);
        isFouund = (int *)bsearch(&n, a, lang, sizeof(int), compare);//bsearch有匹配返回地址,无返回NULL。多个匹配不指定哪一个
        if(isFouund==NULL)
            printf("不在已升序排列的整数序列中\n");
        else
            printf("在已升序排列的整数序列中,地址为%p。\n",isFouund);
    }


    return 0;
}
int compare(const void *p, const void *q)
{
    return (*(int *)p - *(int *)q);
}
int cmp ( const void *a , const void *b )
{
  return *(int *)a - *(int *)b;//升序
}
int duwenjian(char *paixu, int A[], int *lang)
{
    FILE *file;
    int i;
    file=fopen(paixu, "r");
    if (file==NULL) {
        fprintf(stderr, "文档 %s 打开失败.\n", paixu);
        return -1;
    }
    fscanf(file, "%d", lang);
    if (*lang>10000) {
        fprintf(stderr, "文档%s中的数字过多,至多只允许10000位.\n",
        paixu);
        return -1;
    }

    for (i=0; i<*lang; i++) {
        fscanf(file, "%d", &(A[i]));
    }
    return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答