题目:有一个从小到大的有序数组如{1,2,3,3,5,7,10}, 有一个数字5,查找这个数在此数组中的下标

二分法查找 demo

1. 代码

package dichotomy

/**
 * 二分法查找 demo
 * 题目:有一个从小到大的有序数组如{1,2,3,3,5,7,10}, 有一个数字5,查找这个数在此数组中的下标
 */
class DichotomyTest {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            println("DichotomyTest")
            normalMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 6)
            normalMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 9)

            dichotomyMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 6)
            dichotomyMethod(intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 9)
        }

        // 遍历匹配查找定位法
        private fun normalMethod(data: IntArray, key: Int) {
            println("[遍历匹配查找定位法] 源数据:${data.toList()}")
            var count = 0
            for (i in data.indices) {
                count ++
                if (data[i] == key) {
                    println("----> 查找次数: $count, 下标:$i")
                    break
                }
            }
        }

        // 二分法查找定位
        private fun dichotomyMethod(data: IntArray, key: Int) {
            println("[二分法查找定位] 源数据:${data.toList()}")
            var count = 0
            var start = 0
            var end = data.size - 1
            var middle = 0

            while (start < end) {
                count ++

                middle = (start + end) / 2
                if (data[middle] < key) {
                    start = middle
                } else if (data[middle] > key) {
                    end = middle
                } else {
                    println("----> 查找次数: $count, 下标:$middle")
                    return
                }
            }
        }
    }
}

2. 运行结果

[遍历匹配查找定位法] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 6, 下标:5
[遍历匹配查找定位法] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 9, 下标:8

[二分法查找定位] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 3, 下标:5
[二分法查找定位] 源数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
----> 查找次数: 4, 下标:8

Process finished with exit code 0
题目1描述的是要求对一组整数组进行排序,并使用插入排序算法来完成任务。插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序据,在已排序序列中从后向前扫描,找到相应位置并插入。 以下是C++代码示例: ```cpp #include <iostream> #include <vector> #include <ctime> void insertionSort(std::vector<int>& arr) { int n = arr.size(); for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } int main() { // 生成随机数组 srand(time(0)); std::vector<int> testArrays[] = {std::vector<int>(5, 0), std::vector<int>(10, 0), std::vector<int>(100, 0)}; for (size_t i = 0; i < sizeof(testArrays) / sizeof(testArrays[0]); ++i) { for (auto& num : testArrays[i]) { num = rand() % 100000000; // 生成0到1亿之间的随机 } // 插入排序并打印结果 insertionSort(testArrays[i]); std::cout << "Sorted array of length " << testArrays[i].size() << ": "; for (const auto& val : testArrays[i]) { std::cout << val << " "; } std::cout << "\n"; } return 0; } ``` **分析:** - **时间复杂度**:插入排序的时间复杂度在最坏的情况下(输入逆序)是O(n^2),但在最好情况下(已经排序)是O(n)。平均情况下也是O(n^2)。 - **空间复杂度**:插入排序是原地排序,不需要额外的存储空间,空间复杂度为O(1)。 - **实际执行时间和内存空间**:这些会依赖于特定计算机硬件和编译器优化程度。上面的代码在处理不同规模的数组时会有差异,小规模的数组更快,大规模数组则可能需要更多时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值