快速排序算法的特点
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速排序算法 的特点
(1)是不稳定的排序方法; (2)适用于顺序结构,不适用与链式结构; (3)当n较大时,在平均情况下快速排序是 所有内部排序方法中最快的一种,非常适合于初 始记录无序和n值较大的情况。
但是在最坏情况下,在待排序序列已经排好 序的情况下,其递归树成为单支树。比如待排序 记录关键字序列为(1,2,3,4,5),并总是使用第一个 关键字作为枢轴的话。递归树就变成了
快速排序算法 的效率
这样的话,树的深度和树的结点树是一样的, 所以时间复杂度为O(n2)。这种情况下,快速排序 完全蜕化到简单排序的水平。
4938659776132749初始关键字27386597761349进行1次交换后设待排序记彔关键字序列为493865977613274927386597761349进行2次交换后27386597761349进行3次交换后27381376976549进行4次交换后27381376976549完成一趟排序49对左右子表继续进行划分下去的话其对应的递归树为
例题
设待排序记录关键字序列为(49 38 65 97 76 13 27 49*)
初始关键字
49 38 65 97 76 13 27 49*
i
j
j
进行1次 交换后
27 38 65 97 76 13 49*
i
i
j
例题
进行2次 交换后
进行3次 交换后
27 38 i
97 76 13 65 49* jj
27 38 13 97 76 ii
// 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,
// 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
KeyType pivotkey;
L.r[0] = L.r[low];
// 用子表的第一个记录作枢轴记录
pivotkey = L.r[low].key; // 枢轴记录关键字
枢轴记录的合理选择可以避免这种情况的出 现,比如利用“三者取中”的方法:比较当前表 中的第一个记录、最后一个记录、中间一个记录 的关键字,取关键字居中的记录作为枢轴记录, 并将该记录调换到第一个记录的位置。
快速排序算法 的效率
空间复杂度方面,由于快速排序是递归算法, 执行时需要一个栈来存在相应的数据。栈的深度 与递归树的深度是一致的,所以最好情况下是 O(log2n),最坏情况下是O(n)。
// 对顺序表L中的子序列L.r[low..high]进行快速排序
int pivotloc;
if (low < high) {
// 长度大于1
pivotloc = Partition(L, low, high); // 将L.r[low..high]一分为二
QSort(L, low, pivotloc-1); // 对低子表递归排序,pivotloc是枢
65 49* j
例题
进行4次 交换后
完成一 趟排序
27 38 13 76 97 65 49*
ij
j
27 38 13 49 76 97 65 49*
例题
对左右子表继续进行划分下去的话,其对应 的递归树为:
例题
快速排序的算 法
ቤተ መጻሕፍቲ ባይዱ
int Partition(SqList &L, int low, int high) {
while (low<high) {
// 从表的两端交替地向中间扫描
while (low<high && L.r[high].key>=pivotkey) --high;
L.r[low] = L.r[high]; // 将比枢轴记录小的记录移到低端
while (low<high && L.r[low].key<=pivotkey) ++low;
L.r[high] = L.r[low]; // 将比枢轴记录大的记录移到高端
}
L.r[low] = L.r[0];
// 枢轴记录到位
return low;
// 返回枢轴位置
} // Partition
快速排序的算 法
void QSort(SqList &L, int low, int high) {
轴位置
QSort(L, pivotloc+1, high);
// 对高子表递归排序
}
} // QSort
快速排序的算 法
void QuickSort(SqList &L) { // 对顺序表L进行快速排序 QSort(L, 1, L.length);
} // QuickSort 其中Partition函数是进行划分的过程,QSort函数对 Partition函数进行调用,QSort是个递归函数。
快速排序算法 的效率
时间复杂度方面,最好情况下,每一趟划分 后,枢轴都能将记录序列分成两个长度大致相等 的子表。这个时候,快速排序对应的递归树的深 度和log2n是线性的关系,这一点类似于完全二叉 树。由于每一层对枢轴进行定位所需时间为O(n), 所以总的时间复杂度是O(nlog2n)。
快速排序算法 的效率