标签:
1、快速排序
又称分治算法,分治的基本思想是蒋原问题分解为若干个规模更小但结构与原问题相似的子问题,然后递归地解决这鞋子问题,子问题的结组合为原问题的解。
快速排序是一种不稳定的算法,平均时间复杂度为O(n log n),最差情况是O(n^2),空间复杂度O(log n)
(1)基本思想
过程如下:分解->求解->组合。
分解:在无序队列R[1...n]中任选一个元素k为基准记录,并且满足R[1...k].key<=R[k].key<=R[k+1...n].key
求解:递归调用快排算法对左右子区间R[1...k]和R[k+1...n]进行快排过程
组合:递归结束后,左右两个子区间已经有序,因此,该步骤可以忽略。
快速排序的代码如下:
1 void QuickSort(SeqList R,int low,int high) 2 { 3 int pivotpos; 4 if(low<high) 5 { 6 pivotpos=Partition(R,low,high);//计算基准位置 7 QuickSort(R,low,pivotpos-1);//对左区间进行快排 8 QuickSort(R,pivotpos+1,high);//对右区间进行快排 9 } 10 }
(2)划分算法Partition
简单的划分算法步骤:①初始化——设置两个指针 i 和 j ,初值分别为区间的下界和上界,设置区间下界R[i]=R[1]=pivot为基准记录 ②令 j 自 n 起向左扫描,找到第一个关键字小于R[k].key的记录R[j],并将其移到pivot所在位置,即交换基准pivot与R[j],交换后R[j]是基准记录pivot;然后令指针 i 从 i+1 的位置开始向右扫描,直到出现第一个关键字大于R[j].key的记录R[i],并交换R[i]与基准R[j],此时基准记录pivot为R[i],重复第一次过程,直至i=j,结束。此时 i 是基准 pivot 最终的位置,将pivot放在此位置上就完成了一次划分。
划分算法的代码如下:
int Partition(SeqList R,int i,int j) { RaceType pivot=R[i];//定义基准位置 while(i<j) { while(i<j && pivot.key<=R[j].key)//pivot在位置i上,从右向左扫描(j向左移动), j--; //查找第一个关键字小于pivot.key的记录R[j] if(i<j) R[i++]=R[j]; //交换R[i]和R[j],交换后i指针加1 while(i<j&& pivot.key>=R[i].key)//pivot在位置j上,从左向右扫描(i向右移动), i++; //查找第一个关键字大于pivot.key的记录R[i] if(i<j) R[j--]=R[i]; //交换R[i]和R[j],交换后j指针减1 } R[i]=pivot; return i; }
摘抄至程序员面试宝典,侵权必删
标签:
原文地址:http://www.cnblogs.com/mj-selina/p/5804133.html