大一C语言 寻找第K大的数

对于程序的要求:(1)题目要求中的具体数值,要尽量参数化;(2)分函数,不能都写在main()里,IPO过程本身代表的就是函数;(3)要有一个操作的菜单;void showMenu() { while(1) { /* 显示一个菜单 / printf( 1 - ...) cout<<"hello"<<endl; /* 做出选择 */ do { scanf(...) cin>>x; while(sel<0 || sel>最大菜单); / 响应选择 / switch(sel) { case 1: fun1(); break; case 2: fun2(); break; } / 暂停 */ system("pause");` system("cls"); }}(4)要设计读写文本文件的操作FILE *fp;fp = fopen("D;\hello.txt", "w");fprintf(fp, "Hello, world.");fclose(fp):参考博客:https://blog.csdn.net/phynix1977/article/details/45919093论文的要求:(6)绘图建议用visio
一:如何写出至少150行代码,多次尝试自己各处找的资源都无法达到这个要求
二:对于二分法与其他方法的结合与优化不太熟练程序报错

二分法用来干啥? 二分法插入排序吗?
运行结果及代码如下:
(1)菜单

img

(2)读取文件数据,文件数据以空格分隔

img

(3)排序并输出第K大的数

img

(4)排序结果写入文件

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//打印数组
void showArray(int arr[],int len)
{
    int i = 0;
    for(;i<len;i++)
    {
        if(i<len-1)
            printf("%d ",arr[i]);
        else
            printf("%d\n",arr[i]);
    }
}

void Merge(int R[], int low, int m, int high)
{
    //将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]  
    int i = low, j = m + 1, p = 0;                //置初始值  
    int* R1;                        //R1是局部向量  
    R1 = (int*)malloc((high - low + 1) * sizeof(int));
    if (!R1)
    {
        return;                         //申请空间失败  
    }

    while (i <= m && j <= high)                //两子文件非空时取其小者输出到R1[p]上  
    {
        R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];
    }

    while (i <= m)                         //若第1个子文件非空,则复制剩余记录到R1中  
    {
        R1[p++] = R[i++];
    }
    while (j <= high)                      //若第2个子文件非空,则复制剩余记录到R1中  
    {
        R1[p++] = R[j++];
    }

    for (p = 0, i = low; i <= high; p++, i++)
    {
        R[i] = R1[p];                     //归并完成后将结果复制回R[low..high]  
    }
    free(R1);
}

void MergeSort(int R[], int low, int high)
{
    //用分治法对R[low..high]进行二路归并排序  
    int mid;
    if (low < high)
    {   //区间长度大于1   
        mid = (low + high) / 2;               //分解  
        MergeSort(R, low, mid);           //递归地对R[low..mid]排序  
        MergeSort(R, mid + 1, high);        //递归地对R[mid+1..high]排序  
        Merge(R, low, mid, high);          //组合,将两个有序区归并为一个有序区  
    }
}

//从文件读取数组数据
void readData(int a[],int *len)
{
    FILE* fp = fopen("data.txt","r");
    int i = 0;
    *len = 0;
    if(fp == 0)
    {
        printf("文件读取失败!\n");
        return;
    }
    while(!feof(fp))
    {
        if(fscanf(fp,"%d",&a[i]))
            i++;
    }
    *len = i;
    fclose(fp);
}
//随机生成数组数据
void randData(int a[],int len)
{
    int i;
    for(i=0;i<len;i++)
        a[i] = rand()%200; //生成0-199的随机数
}

//写入文件
void writeFile(int a[],int len)
{
    FILE* fp = fopen("sortdata.txt","w");
    for(int i = 0;i<len;i++)
    {
        if(i<len-1)
            fprintf(fp,"%d ",a[i]);
        else
            fprintf(fp,"%d",a[i]);
    }
    fclose(fp);
    
}

//
void showMenu()
{
    int sel;
    int a[10];
    int nmb=0;
    int k;
    while(1)
    {
        printf("1.读取数据文件\n"); //数组数据从文件中读取
        printf("2.数据随机生成\n"); //数组数据随机生成
        printf("3.排序并找出第K大的数\n");
        printf("4.排序结果写入文件\n");
        printf("0.退出程序\n");
        printf("请选择:");
        scanf("%d",&sel);
        switch(sel)
        {
        case 0:
            return;
        case 1:
            readData(a,&nmb);
            printf("读取的数据为:");
            showArray(a,nmb);
            break;
        case 2:
            nmb = 10;
            randData(a,nmb);
            printf("随机生成的数据为:");
            showArray(a,nmb);
            break;
        case 3:
            printf("请输入K(1-%d):",nmb);
            scanf("%d",&k);
            if(k>nmb)
            {
                printf("k大于数组长度\n");
                
            }else
            {
                MergeSort(a,0,nmb-1);
                printf("排序后数据为:");
                showArray(a,nmb);
                printf("第%d大的数是:%d\n",k,a[nmb-k]);
            }
            
            
            break;
        case 4:
            writeFile(a,nmb);
            printf("排序结果写入sortdata.txt成功!\n");
            break;
        }
        system("pause"); //暂停
        system("cls"); //清屏
    }
}




int main()
{
    srand((unsigned int)time(NULL));
    showMenu();
    return 0;
}

看看https://wk.baidu.com/view/2eef38190a12a21614791711cc7931b765ce7be3

对数组排个序,下标为k-1就是你要的数了。

1、排序
2、拿到下标为k-1的值

拿去吧


#include<stdio.h>
int main(){
int a[10000];
int n,temp,i,k,j;
printf("请输入你要输入的数的个数n:\n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[j]<a[i]){
temp=a[j];
a[j]=a[i];
a[i]=temp;}
}
}
printf("请输入你要的到第几小/大的数K:\n");
scanf("%d",&k);
printf("第%d大的数为%d\n",k,a[k-1]);
printf("第%d小的数为%d\n",k,a[n-k]);
return 0;
}