排序算法(高级篇,整理自学堂在线邓俊辉老师《数据结构》课程)

Posted 小鸭酱的书签

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法(高级篇,整理自学堂在线邓俊辉老师《数据结构》课程)相关的知识,希望对你有一定的参考价值。

大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

高级篇算法,包括 快速排序和希尔排序。首先介绍快速排序。

1. quicksort,C.A.R.Hoare (1934~)Turing Award,1980

2. 分治策略,分而治之

quicksort VS. mergesort

(1) 将序列分为两个子序列:S = S1 + S2        规模缩小,彼此独立(max(S1) <= min(S2))

(2) 在子序列分别【递归地】排序之后,原序列自然有序  sorted(S) = sorted(S1) + sorted(S2)

(3) 递归基:只剩单个元素时,本身就是解

(4)mergesort的计算难点在于【合】,quicksort的难点在于【分】

 

好我们来看看quicksort具体实现:

(1) 轴点pivot

          左边的元素均不比它大;右边的元素均不比它小

(2)【划分】  [lo, hi - 1] = [lo, mi - 1] + [mi] + [mi + 1, hi - 1];

算法构架如下

 1 template <typename T>
 2 void Vector<T>::quicksort(Rank lo, Rank hi)
 3 {
 4     if (hi - lo < 2)  // only one element
 5     {
 6         return;
 7     }
 8     Rank mi = partition(lo, hi-1) // construct pivot
 9     quicksort(lo, mi);
10     quicksort(mi+1, hi);
11 }

可见,最重要的是partition这一步

轴点:(1) 有可能不存在;

           (2) 轴点本身必然是就位的。就位是说,它的左边的元素都不比它大,它右边的元素都不比它小

           (3) 有序的序列中,所有元素均为轴点;反之亦然

因此,快速排序就是将数组中的每个元素逐个转化为轴点的过程

           (4)通过适当的交换,可使任意元素转换为轴点

示意图如上。

 

以上是关于排序算法(高级篇,整理自学堂在线邓俊辉老师《数据结构》课程)的主要内容,如果未能解决你的问题,请参考以下文章

《数据结构:邓俊辉版》——冒泡排序

跟着邓公学数据结构 1-a(绪论)

《数据结构:邓俊辉版》——并归排序

《数据结构:邓俊辉版》——交换排序

《数据结构:邓俊辉版》——插入排序

邓俊辉 《数据结构》笔记1 绪论