标签:原理 成本 color log cto 移动 递归调用 vector UI
快速的基本思路是每次都选取一个基准,然后将大于该基准的元素放在右边,小的放在左边。然后利用分治法,对基准的左区间和右区间进行下一轮的快排,直到每个区间只剩一个元素,终止递归。
本算法的关键点就是在选取一个基准后,将所有元素分成两个子区间。利用挖坑填补的生活原理,我们以当前区间为例,一般选取最左端数字为基准,挖出来后。用两个游标low,high放置在区间两端。第一步,high往左移动,找到一个小于基准的元素,填在空缺处(也就是low)。这样high的位置就有一个空缺了,我们再将low向右移动,找到一个大于基准的元素,补在high所在的空缺处。这样依次进行,直至low和high指向同一个位置。此时必然还有一个空缺等待填补,我们就将一开始挖出来的key填补回去。这样,就完成本区间的快排工作。如下图所示:
void quickSort(vector<int> &v, int left, int right) //区间的左边界left和右边界right { if(left<right) //当区间长度为1时就不再继续往下递归了 { int key=v[left]; //取最左边的值为key(基准),并把它挖出来 int low=left; int high=right; while(low<high){ while(low<high&&v[high]>key){ //high往左边移动,找到一个小于key的数字 high--; } v[low]=v[high]; //将这个数字填在low处 while(low<high&&v[low]<key){ //low往右边移动,找到一个大于key的数字 low++; } v[high]=v[low]; //将这个数字填在high处 } v[low]=key; //将基准重新填回到留出来的空缺里 //以此时key的位置基准,分成两个区间,递归调用 quickSort(v,left,low-1); quickSort(v,low+1,right); } }
标签:原理 成本 color log cto 移动 递归调用 vector UI
原文地址:http://www.cnblogs.com/wust-owen/p/7722937.html