对快速排序的理论推导和推广

14 篇文章 0 订阅

对快速排序的理论推导(数学归纳法)和推广

欢迎各位切磋交流算法,本人qq :843230304,为原创,2021年1月18日

一 理论推导(数学归纳法)

给定以下任意一组有序数,找规律:
123456789
12 43 56 126 996
1 9 12 230 443 996
21 85 137 666 996
……

二 个人总结理论:

[定理] 任意取有序数列的3个元素都是有序的!!!

三 提炼思想方法:

把一组序列看作一个整体,分为3个部分,这3个部分宏观上是有序的,然后继续分割个整体,直到不可分割,使得微观上有序。

快速排序就是特例:就是以上3个宏观部分其中一个为微观上的元素

四 快速排序

//快速排序
//平均时间复杂度:O(NlogN)
//最坏情况复杂度:O(N^2)
//不稳定排序(如果相等两数,会交换)
void QuickSort(int *a, int start, int end)
{
    if (start >= end)
        return;

    //左右游标
    int l = start, r = end;

    //取中间参考元
    int mid = a[(end - start) / 2 + start];
    while (l <= r)
    {
        //右元素>参考元,游标左移
        while (l <= r && a[r] > mid)
            r--;

        //左元素>参考元,游标右移
        while (l <= r && a[l] < mid)
            l++;

        //交换左右数值
        if (l <= r)
            std::swap(a[l++], a[r--]);
    }
    //-----------
    // 此时可以宏观看作3个有序数列,理解吗?这里可以引用定理,即是  [左边整体<参考元<右边整体]
    // 宏观往微观缩小,继续分割   左边整体、右边整体  分别为3个宏观上有序的子序列
    // 直到微观上不可再分
    //-----------
	//递归分割左边子序列
    QuickSort(a, start, r);
    //递归分割右边子序列
    QuickSort(a, l, end);
}

五 理论或思想推广

【定理二】任意取有序数列的n个部分,他们都是有序的
所以,你懂的,对于排序算法的推广:
可以把序列分为n个有序的宏观部分,再分别对各个宏观部分向微观方向分解成有序数列,可以完成排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值