日常记录:《算法导论》学习笔记之四—快速排序

  《算法导论》第7章讲到了快速排序(quick sort),快速排序通常是用于排序的最佳的实用选择,因为其平均性能比较好。与合并算法相同,快速排序也是基于分治模式的,笔者再次选择整理扑克牌的情形来解释这一排序过程。

  合并排序中,是将杂乱的牌堆分为两堆,依次再堆子堆牌分解,而在快速排序中,分出子牌堆加了些条件,我们将牌堆底部的牌作为对照牌,将牌堆中大于或者小于这张对照牌的牌分成左右两堆,然后利用同一规则继续对子牌堆分,最后得到的就是整理好的牌。

  我们将这个排序过程用个函数去表示,首先是快速排序的分治递归部分,其伪代码如下:

if l < r
  mid = PARTITION(A, l, r)
  QuickSort(A, l, mid -1)
  QuickSort(A, mid + 1, r)
  其中PARTITION是最重要的部分,这个函数实现了数组的就地排序,其伪代码如下:

key = A[r]
i = l -1
for j : l to r - 1
  if A[j] <= key
    i++
    A[j] <-> A[i]
i++
A[i] <-> A[r]
return i
  给定一个实例,用C++实现快速排序的代码如下:

#include 
   
   
    
    

void QuickSort(int A[], int l, int r);
int PARTITION(int A[], int l, int r);

int main(void)
{
    int A[12] = {13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21};
    QuickSort(A, 0, 11);

    for (int i = 0; i < 12; i++)
        std::cout << A[i] << " ";
}

void QuickSort(int A[], int l, int r)
{
    if (l < r)
    {
        int mid = PARTITION(A, l, r);
        QuickSort(A, l, mid - 1);
        QuickSort(A, mid + 1, r);
    }
}

int PARTITION(int A[], int l, int r)
{
    int key = A[r];
    int i = l - 1;
    int temp = 0;
    for (int j = l; j < r; j++)
    {
        if (A[j] <= key)
        {
            i++;
            temp = A[j];
            A[j] = A[i];
            A[i] = temp;
        }
    }
    i++;
    A[r] = A[i];
    A[i] = key;
    return i;
}
   
   
  在《算法导论》的练习题中也有很多不一样的排序算法,或者是对原有算法进行改进优化得到的变体,当笔者再次翻过头来阅读这本经典书籍时会对这部分内容做详细总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值