快速排序算法

快速排序算法

思想

  1. 选择数组中一个数 x x x进行比较,小于等于 x x x的放在前面,大于 x x x的放在后面
  2. 这样可以形成 “小于等于 x x x的”+ x x x +“大于 x x x的” 的数组
  3. 再对两端进行递归该操作,直到数组长度为1

不同于归并排序,这个是从上到下,进行分解排序

过程可看这个快速排序过程

代码

void quickSort(int *arr, int begin, int end)
{
    if(begin >= end)
        return;
    int temp = arr[begin];
    int i = begin, j = end;
    while(i<j)
    {
        while(i<j && arr[i]<=temp)
            i++;
        arr[j]=arr[i];
        while(i<j && arr[j]>temp)
            j++;
        arr[i]=arr[j]
    }
    arr[i]=temp;
    quickSort(arr, begin, i-1);
    quickSort(arr, i+1, end);
}

运用

1.求第k大的数字

因为每次设置的 x x x知道它的排序在 m m m位,

  • 如果 m = = k m==k m==k,那么 x x x就是目标值
  • 如果 m < k m < k m<k,那么目标值就在后半段,进入查找
  • 如果 m > k m > k m>k,那么目标值就在前半段,进入查找
int getOrder(int *arr, int begin, int end)
{
    int temp = arr[begin];
    int i = begin, j = end;
    while(i<j)
    {
        while(i<j && arr[i]<=temp)
            i++;
        arr[j]=arr[i];
        while(i<j && arr[j]>temp)
            j++;
        arr[i]=arr[j]
    }
    arr[i]=temp;
    return i+1;//因为是顺序,所以+1
}
int getK(int k, int *arr, int begin, int end)
{
    int order = getOrder(arr, begin, end);
    if(order == k)
        return arr[k-1];
    else if(order < k)
        return getK(k, arr, begin, k-2);
    else
        return getK(k, arr, k, end);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值