数组练习:两端汇聚与二分查找

目录

一、练习1:字符从两端向中间汇聚

代码说明:

二、练习2:二分查找

代码说明:

注意事项:


一、练习1:字符从两端向中间汇聚

这个程序演示了如何让字符从字符串的两端向中间逐渐显示。

cpp 复制代码
#include <stdio.h>
#include <string.h>  // 需要添加strlen函数的头文件
#include <windows.h> // 需要添加Sleep函数的头文件

int main()
{
    char arr1[] = "welcome to bit...";
    char arr2[] = "#################";
    int left = 0;
    int right = strlen(arr1) - 1; // 计算字符串长度
    
    printf("%s\n", arr2); // 初始显示全#的字符串
    
    while (left <= right)
    {
        Sleep(1000); // 延时1秒(Windows平台)
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2); // 每次更新后打印
    }
    
    return 0;
}

代码说明:

  1. 使用两个字符数组,arr1存储目标字符串,arr2初始化为全#

  2. 使用leftright两个指针从两端向中间移动

  3. 每次循环将arr1两端的字符复制到arr2对应位置

  4. 使用Sleep(1000)实现1秒的延迟效果(Windows平台)

  5. 每次更新后打印当前状态,形成动画效果


二、练习2:二分查找

这个程序演示了在有序数组中使用二分查找算法查找特定元素。

cpp 复制代码
#include <stdio.h>

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]) - 1; // 计算数组长度
    int key = 7;    // 要查找的数字
    int mid = 0;    // 记录中间元素的下标
    int find = 0;   // 查找标志
    
    while (left <= right)
    {
        // 计算中间位置,避免整数溢出
        mid = left + (right - left) / 2;
        
        if (arr[mid] > key)
        {
            right = mid - 1; // 在左半部分继续查找
        }
        else if (arr[mid] < key)
        {
            left = mid + 1;  // 在右半部分继续查找
        }
        else
        {
            find = 1;       // 找到目标
            break;
        }
    }
    
    if (1 == find)
        printf("找到了,下标是%d\n", mid);
    else
        printf("找不到\n");
    
    return 0;
}

代码说明:

  1. 二分查找要求数组必须是有序的

  2. 使用leftright标记查找范围的左右边界

  3. 每次取中间位置mid进行比较:

    • 如果中间值大于目标值,则在左半部分继续查找

    • 如果中间值小于目标值,则在右半部分继续查找

    • 如果相等则找到目标

  4. 使用mid = left + (right - left) / 2计算中间位置,避免(left + right)可能导致的整数溢出

  5. 时间复杂度为O(log n),比顺序查找O(n)更高效

注意事项:

  1. 二分查找仅适用于有序数组

  2. 计算中间位置时推荐使用left + (right - left) / 2方式,避免整数溢出

  3. 查找结束时需要检查find标志来确定是否找到目标