如何快速判定一个排序算法的主循环该用大于逻辑还是小于逻辑,如何判断从表的开头开始遍历还是表的结尾开始便利更优

文章目录

前言

由于博客还在施工,所以又来优快云写笔记了
https://www.ksroido.art/
下图是用模板写的一个首页,之后会写一篇教程如何做(大概不会咕咕咕)
在这里插入图片描述

正文

其实这个问题和下面的问题是关联的
我们以一个简单的插入排序为例子

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
void insertSort(int arr[],int len){
    int i,j,curr;
    for (int i = 1; i < len; ++i) {
        curr = arr[i];
        for (int j = i-1; j > 0 && arr[j]>curr ; --j) {
            arr[j+1] = arr[j];
        }
        arr[j+1]=curr;
    }

}

注意arr[j]>currj = i-1
为什么不是arr[j]<currj = 0
首先为什么j = i-1 因为插入排序需要插入, 插入需要后续移动, 从末尾开始可以减少插入移动次数
因为从头开始的话第一次移动就需要移动所以元素,从末尾开始第一次移动只需要移动一个元素, 以此类推第N次需要移动N个
然后我们已经确定了我们要从末尾开始, 这就意味着我们最初遇到的元素,在数学期望上是偏大的, 同时我们即将移动的curr元素在数学期望上是偏小的

然后我们要明白,我们做完比较的目的是swap还是continue
如果是continue, 那么我们使用比较符号的方法应该符合数学预期, 也就是说, arr[j]>curr 如果是swap&break, 那说明现在比较的内容不符合数学预期, 所以我们需要用arr[j]<curr
另外一点是往往swap&break只做一次, 而且考虑到不符合数学预期, 所以一般主循环用符合数学预期的方式+continue, 因为break就跳出主循环了, 还需要加一个真正的循环出口点判断, 得不偿失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值