二分法 希尔排序(c语言)

本文介绍了如何使用C语言实现二分查找法,这是一种针对有序数据的高效查找策略。在实际应用中,如果数据未排序,需要先进行排序,这里选择了希尔排序作为预处理步骤。程序运行展示了排序和查找过程的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言

二分查找法

所谓的二分查找法,其实是一种有序的查找方法,也称折半查找(Binary Search),如果是无序的则要先进行排序操作。基本思想是:目标值通过与中间元素比较,可分为三种情况:
第一种情况:目标值与中间元素相等,查找结束;
第二种情况:目标值比中间元素大,则把后半部分的中间元素与目标值比较;
第二种情况:目标值比中间元素小,则把前半部分的中间元素与目标值比较;
这三步一直循环,直到查找结束。

由于数组顺序可能未经过排序,所以使用了希尔排序算法进行排序,再进行查找

程序如下:

#include <stdio.h>

int BinarySearch(int *nums, int numsSize, int target);
int BinarySearchRecursive(int *nums, int first, int last, int target);
int ShellSort(int *nums, int n);
//    进行插入排序
//    初始时从dk开始增长,每次比较步长为dk
int Insrtsort(int *a, int n, int dk)
{
    for (int i = dk; i < n; ++i)
    {
        int j = i - dk;
        if (a[i] < a[j])
        {                   //    比较前后数字大小
            int tmp = a[i]; //    作为临时存储
            a[i] = a[j];
            while (a[j] > tmp)
            { //    寻找tmp的插入位置
                a[j + dk] = a[j];
                j -= dk;
            }
            a[j + dk] = tmp; //    插入tmp
        }
    }
}

// 希尔排序
int ShellSort(int *nums, int n)
{
    int dk = n / 2; //    设置初始dk
    while (dk >= 1)
    {
        Insrtsort(nums, n, dk);
        dk /= 2;
    }
}
int main(int argc, char const *argv[])
{
    int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 10};
    int n = sizeof(num) / sizeof(int);
	 // 有可能数组是乱序的,所以需要先排序
    // 希尔排序算法
    ShellSort(num, n);    

    // 非递归二分查询
    // int flag = BinarySearch(num, n, 4);
    // 递归二分查询 lg(N)
    int flag = BinarySearchRecursive(num, 0, n, 4);
    if (flag == -1)
        printf("无该数字!!\n");
    else
        printf("已经找到该数字!!\n%d\n", flag);
    return 0;
}

// 非递归二分查询
int BinarySearch(int *nums, int numsSize, int target)
{
    int first = 0, last = numsSize - 1, mid;
    while (first <= last)
    {
        // 防溢出  >> 右移 相当于 / 2
        int mid = (first + last) >> 1;
        if (nums[mid] == target)
        {
            return mid;
        }
        else if (nums[mid] > target)
        {
            last = mid - 1;
        }
        else if (nums[mid] < target)
        {
            first = mid + 1;
        }
    }
    return (-1);
}

// 递归二分查询 lg(N)
int BinarySearchRecursive(int *nums, int first, int last, int target)
{
    if (first > last)
        return -1;
    int mid = (first + last) / 2;
    if (nums[mid] == target)
        return mid;
    else if (nums[mid] < target)
        return BinarySearchRecursive(nums, mid + 1, last, target);
    else
        return BinarySearchRecursive(nums, first, mid - 1, target);
}

运行程序,结果如下:

运行程序,结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值