两种快速排序和找第k大数

本文深入探讨了快速排序与寻找第k大数算法之间的联系,揭示了其背后的代码逻辑一致性,并详细解析了容易引发错误的关键环节。通过对比两种方法的实现细节,旨在帮助开发者更深入地理解快速排序技巧,同时避免常见陷阱。
摘要由CSDN通过智能技术生成

快速排序和找第k大数几乎用的是相同代码片段。

和二分查找一样,快速排序也很容易出错。

void swap(int *a,int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void quick_sort1(int *a, int l,int r)
{
    if (l >= r) return;
    int k = a[l];
    int i = l; int j = r + 1;
    for (;;)
    {
        do i++; while (i <= r && a[i] < k);
        do j--; while (a[j] > k);
        if ( i > j ) break;
        swap(a+i,a+j);
    }
    swap(a+l,a+j);
    quick_sort1(a,l,j-1);
    quick_sort1(a,j+1,r);
}


void quick_sort2(int *a,int l,int r)
{
    if (l >= r) return;
    int k = a[l];
    int i = l;
    for (int j = l + 1; j <= r; j++)
    {
        if (a[j] < k)
        {
            i++;
            swap(a+i,a+j);
        } 
    }
    swap(a+l,a+i);
    quick_sort2(a,l,i-1);
    quick_sort2(a,i+1,r);
}


int find_kth2(int *a,int l,int r, int k)
{
   if (l == r) 
   {
       return a[l];
   }
   int m = a[l];
   int i = l;
   for (int j = l + 1; j <= r; j++)
   {
       if (a[j] < m)
       {
           i++;
           swap(a+j,a+i);
        }
   }
   swap(a+l,a+i);
   if (k <= i - l) return find_kth2(a,l,i-1,k);
   else if ( k == i - l + 1) return find_kth2(a,i,i,1);
   else return find_kth2(a,i+1,r,k-(i-l+1));
}

int find_kth1(int *a,int l, int r, int k)
{
    if ( l == r ) return a[l];
    int m = a[l];
    int i = l; int j = r + 1;
    for (;;)
    {
        do i++; while (i <= r&& a[i] < m);
        do j--; while ( a[j] > m);
        if ( i > j) break;
        swap(a+i,a+j);
    }
    swap(a+l,a+j);
    if ( k <= j - l) return find_kth1(a,l,j-1,k);
    else if ( k == j - l + 1) return find_kth1(a,j,j,1);
    else return find_kth1(a,j+1,r,k-(j-l+1));

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值