数据结构之快速排序

原理与图解

快速排序从程式上看起来和归并排序特别像,都采取了递归分治的思想,将数据逐步分解。快排首先在序列中选定某一个枢轴(pivot),然后将除枢轴位置的数据与枢轴数据比较,大于的放在右边,小于的放在左边,然后分两边再次递归,直到递归数据个数趋为1,这样数据就排好序了。

在这里插入图片描述

代码实现

void QuickSort(int arr[], int num);
void quicksort(int arr[], int head, int tail);
int partition(int arr[], int head, int tail);
void swap(int arr[], int a, int b)
{
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

void QuickSort(int arr[], int num)
{
    quicksort(arr, 0, num - 1);
}

void quicksort(int arr[], int head, int tail)
{
    if(head >= tail)
        return;
    int mid = partition(arr, head, tail);
    quicksort(arr, head, mid - 1);//partition分出的mid已经在正确的位置,倘若再放进去就会陷入死循环
    quicksort(arr, mid + 1, tail);//所以分为mid-1和mid+1的两段区间
}

int partition(int arr[], int head, int tail)
{
    int i, j, pivot;
    i = j = head;
    pivot = arr[tail];

    for (; i < tail; ++i)
    {
        if(arr[i] < pivot)
        {
            if(i != j)
                swap(arr, i, j);
            ++j;
        }
    }

    swap(arr, j, tail);
    return j;
}

算法分析

  1. 稳定性:快排不是稳定的排序算法,快排的插入与交换取决于枢轴点的选取,比如说8,6,8,1,5,3这个数组,在第一轮的分区中第一个8就会排到第二个8后面,所以快排不是稳定的排序算法

2.空间复杂度:单单通过算法就能看出并没有像归并那样额外申请内存,仅仅只需要在同个数组内完成,因此为O(1),属于原地排序算法

3.时间复杂度:因为采用了与归并类似的思想,假设数组每次都能完美拆分为两个对半的,这样的时间复杂度即为O(nlogN),但是枢轴值的选取倘若很极端,极端到每次的选择要么为最大值,要么为最小值,就相当于冒泡排序那样,就会退化成为O(n²)

快排的优化

  1. 在上面的时间复杂度分析中,可以看出快排的时间复杂度并不稳定,造成这个结果的原因就是主要因为枢轴值的选择,因此对枢轴值选择的优化颇为重要,比如说三数取中,九数取中,尽量扩大采样数据的范围,这样才能优化枢轴值的选择
  2. 当我们在递归到某个深度的时候,数据规模较小,此时插入排序的性能可能比快排的性能还要好,则可以设置一个阈值,切换排序算法的实现,这样也能提高效率

快排与归并的比较

  1. 归并直接首先直接二分分区,落井下石到最底层才开始执行合并排序的操作,归并由下到上
    快排首先会确定位置再分区,然后递归,随着中间位置点的越分越多,数据的序列性表现的越明显,快排由上到下

  2. 归并的空间复杂度比快排高,尤其在大量数据面前,归并的内存占用相当可怕

  3. 快排的时间复杂度并不如归并的稳定

  4. 快排是不稳定的排序算法,有可能会改变相同元素的先后顺序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值