快速排序
(学习基础,虽然现在的库里都封装好了,但是可以学习基本思想。)
思想:
快速排序就是找一个中枢(正常是第一个),以升序为例将小于中枢的放在数组左边,将大于中枢的放在数组右边。然后左右两边继续递归下去。
快速排序越接近无序效率越高,时间复杂度最好的是O(nlog2n),待排接近有序的最坏的情况是O(log2n),空间复杂度是O(log2n)
伪代码:
void QuickSort(vector<int> &qs, int low, int high) {
//vector<int>::iterator temp=qs.begin(); //正常将头作为中枢
//vector<int>::iterator i = qs.begin();
//vector<int>::iterator j = qs.end() - 1;
//vector<int>::iterator i = low, j = high;
int i = low, j = high;
if (i < j) { //不加会导致越界死循环
int temp = qs[i];
while (i < j) {
//从右边开始检索
while (j > i && qs[j] > temp) --j; //从右往左直到找到一个比temp小的值
if (i < j) {
qs[i] = qs[j];
++i;
}
while (i < j && qs[i] < temp) ++i;
if (i < j) {
qs[j] = qs[i];
--j;
}
}
qs[i] = temp;
QuickSort(qs, low, i - 1);
QuickSort(qs, i + 1, high);
}
}
int main(){
vector<int> nums = { 4,3,21,5,2,10,7 };
QuickSort(nums, 0,nums.size()-1);
for (vector<int>::iterator ii = nums.begin(); ii != nums.end(); ++ii)
cout << *ii << endl;
return 0;
}
总结:
快速排序并不难,但是里面的一些有界性还是要好好看看,另外这边我因为在学stl,所以都希望尝试使用一些没用过的数据结构,还有我这边本来想直接使用迭代器来进行下标比对,但是除了find()我没有找到合适的函数,所以哪位大才看见了,可以教一下我。