C语言作业(附二分算法)

一、题目:

1.(ch6_1.c)定义一维数组,存储N个整型数据,输入实际处理元素的个数n(n<=N),产生n个随机数(随机数小于100)存入数组并显示。完成如下功能:

(1)求出所有高于平均数的数据。

(2)交换最大数和最小数的位置。

(3)对这组数据进行逆置。

(4)对这组数据进行排序(递增)并显示。

(5)从键盘输入一个数,查找数组中是否存在,并显示其下标。

 对排序前(无序)数据采用顺序查找,显示依次比较的数据、比较次数以及查找结果。

 对排序后数据采用二分查找,显示依次比较的数据、比较次数以及查找结果。

二、源码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 105

int main() {
    //将时间作为随机数种子
    srand((unsigned int)time(NULL));

    int arr[N];
    int n, max = -1e6, max_p, min = 1e6, min_p;
    double sum, ave;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        arr[i] = rand() % 100 + 1; //产生1-100的随机数
        sum += arr[i];
        //生成时就获得最大值最小值的下标
        if (arr[i] > max) {
            max_p = i;
            max = arr[i];
        }
        if (arr[i] < min) {
            min_p = i;
            min = arr[i];
        }
    }
    //输出原数组
    printf("生成的数组为:\n");
    for (int i = 1; i <= n; i++) {
        printf("%d  ", arr[i]);
    }
    printf("\n");


    //(1)求出所有高于平均数的数据:
    ave = sum / n;
    printf("所有高于平均数的数据:\n");
    for (int i = 1; i <= n; i++) {
        if (arr[i] > ave)
            printf("%d  ", arr[i]);
    }
    printf("\n");


    //(2)交换最大数和最小数的位置。
    int t = arr[max_p];
    arr[max_p] = arr[min_p];
    arr[min_p] = t;
    printf("交换最大数和最小数的位置后:\n");
    for (int i = 1; i <= n; i++) {
        printf("%d  ", arr[i]);
    }
    printf("\n");


    //(3)对这组数据进行逆置:
    int t3 = 0;
    for (int i = 1; i <= n / 2; i++) {
        t3 = arr[i];
        arr[i] = arr[n + 1 - i];
        arr[n + 1 - i] = t3;
    }
    printf("对这组数据进行逆置后:\n");
    for (int i = 1; i <= n; i++) {
        printf("%d  ", arr[i]);
    }
    printf("\n");


    //(4)对这组数进行排序:
    //排序前复制一个数组,以便进行第五小题的顺序查找:
    int arr_c[N];
    for (int i = 1; i <= n; i++) {
        arr_c[i] = arr[i];
    }

    int t4 = 0;
    for (int i = 1; i <= n - 1; i++) {
        for (int j = 1; j <= n - i; j++) {
            if (arr[j] > arr[j + 1]) {
                t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    printf("对这组数据进行排序后:\n");
    for (int i = 1; i <= n; i++) {
        printf("%d  ", arr[i]);
    }
    printf("\n");

    //(5)从键盘输入一个数,查找数组中是否存在,并显示其下标:
    int t5;
    printf("请输入一个要查找的数:\n");
    scanf("%d", &t5);
    //5.1对排序前(无序)数据采用顺序查找,显示依次比较的数据、比较次数以及查找结果。
    printf("顺寻查找:\n");
    int flag = 0, id;
    for (int i = 1; i <= n; i++) {
        printf("查找中:%d\n", arr_c[i]);
        if (t5 == arr_c[i]) {
            flag = 1;
            id = i;
            break;
        }
    }

    if (flag == 1)
        printf("目标数字%d存在,下标为:%d,查找次数:%d\n", t5, id, id);
    else
        printf("目标数字%d不存在,查找次数:%d\n", t5, n);
    //5.2对排序后数据采用二分查找,显示依次比较的数据、比较次数以及查找结果。
    printf("二分查找:\n");
    int low = 1, high = n; // 待查区域的边界
    int mid;
    int count = 0;
    flag = 0;
    while (low <= high) {
        count++;
        mid = (high + low) / 2;
        if (arr[mid] == t5) {
            printf("查找中:%d\n", arr[mid]);
            flag = 1;
            break;
        } else if (arr[mid] > t5) {
            printf("查找中:%d\n", arr[mid]);
            high = mid - 1;
        } else if (arr[mid] < t5) {
            printf("查找中:%d\n", arr[mid]);
            low = mid + 1;
        }
    }
    if (flag == 1)
        printf("目标数字%d存在,下标为:%d,查找次数:%d\n", t5, mid, count);
    else
        printf("目标数字%d不存在,查找次数:%d\n", t5, count);

}

欢迎改正与补充

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇