快速排序
//两个哨兵i和j,i从左往右找大于key的值,j从右往左找小于key的值,找到之后交换。循环之后还有一次交换
void quicksort(vector<int>& a, int left, int right)
{
if (left >= right)
return;
int key = a[left];
int i = left;
int j = right+1;
while (true)
{
while (a[++i] <= key)
if (i == right)
break;
while (a[--j] >= key)
if (j == left)
break;
if (i >= j) break;
Swap(a,j,i);
}
Swap(a,j,left);
quicksort(a, left, j - 1);
quicksort(a, j + 1, right);
}
void Swap(vector<int>&a, int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
快速排序的随机写法,注意将partition与quicksort两个函数分开
void Swap(vector<int>&a, int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int randomnum(int left, int right) {
return (rand() % (right - left + 1)) + left;
}
int partition(vector<int>& n