快速排序的基本思路

快速排序

快速排序的基本思路是: 通过一趟排序将待记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个有序的目的。

int Partiton(SqList *L, int low, int high)
{   // 将每个枢轴值放入其排序后应该所在的位置
    int pivotkey = L->Array[low];  // 先将每个表的low作为枢轴值
    while (low < high)
    {
        while (low < high && L->Array[high] >= pivotkey)
            high--;  
        swap(L, low, high);  // 将比枢轴值小的交换到前边
        while (low < high && L->Array[low] <= pivotkey)
            low++;  
        swap(L, low, high);  // 将比枢轴值大的交换到后边
    }
    return low;  // 返回枢轴值,方便递归不含该位置的子表
}
void QSort(SqList *L,int low,int high)
{
    int pivot;
    if (low < high)
    {
        pivot = Partiton(L, low, high);  // 将数组不断一分为二,并且算出枢轴值
        QSort(L, low, pivot - 1);  // 对前半部分进行快速排序
        QSort(L, pivot + 1, high);  // 对后半部分进行快速排序
    }
}
void Quick_Sort(SqList *L)  // 快速排序的主函数
{
    QSort(L, 1, L->length);
}

对于代码中最明显的就是是递归,不过还有一个更重要的部分就是划分,不断的通过pivot将数组划分开来,同时将pivot的值分配到应该所在的位置。
在这里插入图片描述
得到第一层划分结束后,我们将5已经放入对应的位置,为了避免后面排序时对其干扰我们在代码上进行了避让

        QSort(L, low, pivot - 1);  // 对low到piovt-1的子列表划分
        QSort(L, pivot + 1, high);  // 对piovt+1到high的子列表划分

这里将数组列表划分为两个子列表,并对其分别进行递归划分,不断遍历后,直到划分为子序列中只有一个元素不能在划分时,我们也将数组排序完成了。

对于快速排序的基本思想就是这样,如果对本文有异议,还请指出其错误,欢迎各位指教​✌️​。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值