算法导论学习笔记(七)- 快速排序

1快速排序概述

     快速排序是一个使用分治思想的排序算法,具有如下优点:
     1. 算法的期望运行时间为θ(nlgn),且其中蕴含的常数因子较小,故而快速排序算法通常是实际应用中最好的选择。
     2. 原址排序,排序过程中只需要有限个辅助空间。
    

2算法描述

     快速排序通过分治的算法设计思想,借助关键子过程partition将输入(这里假定算法的输入为互异关键字key组成的整型数组)划分为比主元小和大的两部分,主元可以随机选择也可以选择数组特定index位置的key。其中,分治的思想如下:
      (1) 分解:借助partition子过程将输入数组分解为比主元小和大的两部分。
      (2) 解决:对这两部分递归的调用快速排序使其有序。
      (3) 合并:由于是原址排序,故合并步骤可以省略。

算法的伪代码如下:

QUICKSORT(A, p ,r)
//算法的边界条件
	if(p < r)
		//算法的关键过程,通过调用PARTITION将输入划分为主元小和大的两部分
		q=PARTITION(A,p,r)
		//对比主元小的这一部分递归调用快速排序使用有序
		QUICKSORT(A,p,q-1)
		//对比主元大的这一部分递归调用快速排序使其有序
		QUICKSORT(A,q+1,r)

PARTITION(A,p,r)
	//主元
	pivot = A[p]
	//比主元pivot小的区域的终止下标,同时也是两个部分的交界点
	j = p;
	//数组下标从 p + 1 到 r的元素与主元pivot进行比较
	for( i = p + 1 to r)
		//如果数组元素小于主元,则将终止下标+1的数组元素与A[i]交换
		if(A[i] < pivot) 
			j++
			swap(A[j],A[i])
	//结束时将主元放在合适的位置		
	swap(A[j+1],A[p])
	

3快速排序性能

     快速排序的期望运行时间为θ(nlgn),最坏情况运行时间为θ(n2),在实际使用过程中快速排序的平均运行时间更接近于其最好的情况而不是最坏情况运行时间。快速排序的运行时间依赖于PARTITION函数对数组的划分是否平衡,在最平衡的划分下,原问题被分解为规模为 [n/2」的子问题,其运行时间为θ(nlgn)。而在最不平衡的划分下,原问题被分解为0和n -1的两个子问题,算法取得最坏情况运行时间θ(n2),此外在输入已经完全有序的情况下,算法也取得最坏情况运行时间。

你可能感兴趣的:(算法导论学习笔记)