快速排序
来源:互联网 发布:主人网络怎么开启 编辑:程序博客网 时间:2024/06/07 23:37
快速排序的优点在于在合适的位置进行分割并且不用额外的数组。
#include <vector>using namespace std;template <typename Comparable>void quickSort(vector<Comparable> & a){ quickSort(a,0,a.size()-1);}//三位中值分割template <typename Comparable>const Comparable & median3(vector<Comparable> & a,int left,int right){ int center=(left+right)/2; if(a[right]<a[left]) std::swap(a[center], a[left]); if (a[right]<a[center]) std::swap(a[right], a[center]); if(a[center]<a[left]) std::swap(a[center], a[left]); std::swap(a[center], a[right-1]); return a[right-1]; //将pivot放在right-1的位置}template <typename Comparable>void quickSort(vector<Comparable> & a,int left,int right){ if(left+10<=right) //当数量比较少时,使用插入排序效果较好 { const Comparable & pivot=median3(a, left, right); int i=left,j=right-1; for(;;) { while (a[++i]<pivot) {} while (pivot<a[--j]) {} if(i<j) std::swap(a[i], a[j]); else break; } std::swap(a[i], a[right-1]); quickSort(a, left, i-1); quickSort(a,i+1,right); } else { insertionSort(a); }}/* int i=left+1,j=right-2; for(;;) { while(a[i]<pivot){++i} while(pivot<a[j]){--j} if(i<j) { std::swap(a[i],a[j]); i++; --j; } else { break; } */