排序

来源:互联网 发布:淘宝服务商入驻流程 编辑:程序博客网 时间:2024/05/01 19:36

    合并排序:分成两部分,每部分都排好序了,最后两部分合并。A[p..r]中,A[p..q]和A[q+1..r]都已排好序了,最后合并成一个已排好序的子数组代替当前子数组A[p..r],这并不是一个就地排序。 
    (二叉)堆:数据结构是一种数组对象,它可以被视为一棵完全二叉树。在最大堆中,除了根以外的每个结点i,有 A[parent(i)] >= A[i],最小堆则是:A[parent(i)] <= A[i]。它具有如下操作:
    MAX-HEAPIFY 过程, 运行时间为O(lgn),是保持最大堆性质的关键。
    BUILD-MAX-HEAP 过程,以线形时间运行,可以在无序的输入数组基础上构造出最大堆。
    HEAPSORT 过程,运行时间为O(nlgn),对一个数组原地进行排序。
    MAX-HEAP-INSERT,HEAP-EXTRACT-MAX, HEAP-INCREASE-KEY, HEAP-MAXIMUM 过程的运行时间为O(lgn), 可以让堆结构作为优先队列使用。
    快速排序:最坏运行时间为clip_image002[4]。但快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为clip_image002[6],且clip_image002[8]记号中隐含的常数因子很小。另外,还能够进行就地排序。
    快速排序也是基于分治模式的。下面是对一个典型子数组A[p..r]排序的分治过程的三个步骤:
    分解:数组被划分成两个子数组A[p..q-1]和A[q+1..r],使A[p..q-1] <= A[q] 而且 A[q+1..r] >= A[q]。
    解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]排序。
    合并:合并不需要操作,因为此时已经排序好了。
    PARTITION总是选择一个x=A[r]作为主元(pivot element),并围绕它来划分子数组A[p..r]。我们可以把这个数组分成三部分,在A[p..i]<=A[r], A[i+1..j-1] > A[r], A[j..r-1] 还没进行任何操作。
    在循环的第一轮迭代开始之前,有i = p-1 和 j = p。在p和i之间没有值,在i+1和j-1之间也没有值。过程PARTITION的一次迭代中可能发生的两种情况。

    a)如果A[j]>x,需要做的唯一操作是使j+1。

    b)如果A[j] <= x,则将下标i+1,并且A[i]和A[j]互相交换,再使j+1。

    快速排序的运行时间与划分是否对称有关,而后者又与选择了哪一个元素来进行划分有关。在快速排序中,当好、差划分交替分布在各层中时,快速排序的运行时间就如全是好的划分时一样,仍然是clip_image002[10]

    在上面的排序中,各元素的次序基于输入元素间的比较。称为比较排序。任何比较排序在最坏情况下都要用clip_image002[12]次比较来进行排序,所以合并排序和堆排序是渐进最优的。
    计数排序: 假设n个输入元素中的每一个都是介于0到k之间的整数。它的基本思想是对每一个输入元素x,确定出小于x的元素个数。有了这个信息,就可以把x直接放到它在最终输出数组中的位置。我们假设输入是个数组A[1..n],另外还需要两个数组:存放排序结果的B[1..n],以及提供临时存储区的C[0..k]。C[i]包含小于等于i的元素个数。总时间是clip_image002[14]
    计数排序算法是稳定的。而且计数排序经常用作基数排序的一个子过程,计数排序的稳定性对基数排序的正确性来说,是非常关键的。 
    基数排序:对有多个关键字域的记录进行排序。若我们根据三个关键字年,月,日排序,用一种稳定的排序方法对所给信息进行三次排序:先以日,其次对月,再对年。当每位数字都介于0到k-1之间,且k不太大时,对n个d位数的每一遍处理的时间为clip_image002[16],共有d遍,故基数排序的总时间为clip_image002[18]
    利用计数排序作为中间稳定排序的基数排序不是原地排序,当内存容量比较宝贵时,像快速排序这样的原地排序算法可能是更为可取的。
    桶排序:桶排序假设输入由一个随机过程产生,该过程将元素均匀而独立的分布在区间[0,1)上。把[0,1)划分成n个相同大小的子区间。然后,将n个输入数分布到各个桶中去。
在桶排序算法的代码中,假设输入的是一个含n个元素的数组A,且每个元素满足0<=A[i]<1。另外,还需要一个辅助数组B[0..n-1]来存放链表。第i个桶中存放了半开区间[i/10, (i+1)/10)中的值,这样就会构成一个链表,这个链表中的值是排好序了的。所以,桶排序的期望运行时间为clip_image002[20]

原创粉丝点击