快速排序算法的特点

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

L.r[high] = L.r[low]; // 将比枢轴记录大的记录移到高端
}
L.r[low] = L.r[0];
// 枢轴记录到位
return low;
// 返回枢轴位置
} // Partition
快速排序的算 法
void QSort(SqList &L, int low, int high) {
快速排序算法 的特点
(1)是不稳定的排序方法; (2)适用于顺序结构,不适用与链式结构; (3)当n较大时,在平均情况下快速排序是 所有内部排序方法中最快的一种,非常适合于初 始记录无序和n值较大的情况。
但是在最坏情况下,在待排序序列已经排好 序的情况下,其递归树成为单支树。比如待排序 记录关键字序列为(1,2,3,4,5),并总是使用第一个 关键字作为枢轴的话。递归树就变成了
快速排序算法 的效率
这样的话,树的深度和树的结点树是一样的, 所以时间复杂度为O(n2)。这种情况下,快速排序 完全蜕化到简单排序的水平。
快速排序算法 的效率
时间复杂度方面,最好情况下,每一趟划分 后,枢轴都能将记录序列分成两个长度大致相等 的子表。这个时候,快速排序对应的递归树的深 度和log2n是线性的关系,这一点类似于完全二叉 树。由于每一层对枢轴进行定位所需时间为O(n), 所以总的时间复杂度是O(nlog2n)。
快速排序算法 的效率
例题
设待排序记录关键字序列为(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; // 枢轴记录关键字
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;
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) {
轴位置
QSort(L, pivotloc+1, high);
// 对高子表递归排序
}
} // QSort
快速排序的算 法
void QuickSort(SqList &L) { // 对顺序表L进行快速排序 QSort(L, 1, L.length);
} // QuickSort 其中Partition函数是进行划分的过程,QSort函数对 Partition函数进行调用,QSort是个递归函数。
枢轴记录的合理选择可以避免这种情况的出 现,比如利用“三者取中”的方法:比较当前表 中的第一个记录、最后一个记录、中间一个记录 的关键字,取关键字居中的记录作为枢轴记录, 并将该记录调换到第一个记录的位置。
快速排序算法 的效率
空间复杂度方面,由于快速排序是递归算法, 执行时需要一个栈来存在相应的数据。栈的深度 与递归树的深度是一致的,所以最好情况下是 O(log2n),最坏情况下是O(n)。
// 对顺序表L中的子序列L.r[low..high]进行快速排序
int pivotloc;
if (low < hiFra Baidu bibliotekh) {
// 长度大于1
pivotloc = Partition(L, low, high); // 将L.r[low..high]一分为二
QSort(L, low, pivotloc-1); // 对低子表递归排序,pivotloc是枢
相关文档
最新文档