南大算法设计与分析课程复习笔记(4)L4 - QuickSort
一、快速排序
算法导论上关于快速排序有两种写法
第一种,从头到尾遍历,不断将小于基准元素的项移到前面。代码很简介,只需要维护一个交换位置,表示小于基准元素的末尾位置加一
我们看算法导论上的一个例子:
代码实现(代码中用p记录上面i+1的位置,pos2应该为数组长度减1):
void quicksort(vector<int>& v, int pos1,int pos2) { if (pos1 >= pos2) return; int p = pos1; for (int i = pos1; i < pos2; ++i) { if (v[i] < v[pos2]) { swap(v[p], v[i]); ++p; } } swap(v[p],v[pos2]); quicksort(v,pos1,p-1); quicksort(v,p+1,pos2); }
第二种,维护两个位置,第一个位置向后寻找,直到找到大于pivot的元素,第二个位置向前寻找,直到找到小于pivot的元素,然后互换。
代码实现:
void quicksort2(vector<int>& v, int pos1, int pos2) { if (pos1 >= pos2) return; int p1 = pos1; int p2 = pos2; int p = v[pos1]; while (true) { while (p1<pos2 && v[p1]<=p) { ++p1; } while (p2>pos1 && v[p2]>=p) { --p2; } if (p1 < p2) swap(v[p1], v[p2]); else break; } swap(v[pos1],v[p2]); quicksort2(v,pos1,p2-1); quicksort2(v,p2+1,pos2); }
二、快速排序的分析
最坏情况、平均情况什么的,懒得写了,书上很清楚,不啰嗦了,算法导论上也有很多。