【算法】pdqsort

2023-03-28  本文已影响0人  如雨随行2020

pdqsort介绍

pdqsort(Pattern-defeating quicksort)是一种融合插入排序,堆排序和优化后的快排的新型排序算法,rustgo1.19中采用;

时间复杂度

Best Avg Worst
O(n) O(n*logn) O(n*logn)

整体流程图

image.png

为了理解上图,我们先回顾一下三个基本的排序算法

插入排序

Best Avg Worst
O(n) O(n^2) O(n^2)

如果原始数组接近有序的情况下,最好O(n),逆序时最坏O(n^2)

堆排序

Best Avg Worst
O(n*logn) O(n*logn) O(n*logn)

堆排序无论何种情况,都要建堆再依次出堆,都是O(n*logn)

快速排序

Best Avg Worst
O(n*logn) O(n*logn) O(n^2)

快排的性能跟pivot的选取相关

如果每次pivot都能将数组均分为两个部分,达到最好O(nlogn),可以看作一棵完全二叉树,pivot是每一层的结点,每层都要比较n次,树的高度是logn,所以是nlogn;

而如果每次pivot都是数组最值(最大或者最小),最差O(n^2);

benchmark

根据序列元素排列情况划分

在此基础上,还需要根据序列长度划分(16/128/1024)

短序列时插入排序最快

[图片上传失败...(image-6b51d6-1680024129373)]

有序时插入排序最快

[图片上传失败...(image-8de03d-1680024129373)]

结论

短序列和有序情况下,插入排序最优;大部分情况(无序,中长序列)快速排序略优于堆排序

pdqsort实现思路

version1

[图片上传失败...(image-aad420-1680024129373)]

version2

pivot选择

寻找近似中位数

pivot采样方式探知序列当前状态的能力

注:插入排序实际使用的是partialInsertionSort,即有限次数的插入排序

[图片上传失败...(image-9ac8c-1680024129373)]

final version

上一篇 下一篇

猜你喜欢

热点阅读