快排:
void quick_sort(vector<int>&a,int l, int r)//应用二分思想
{
int mid = a[(l + r) / 2];//中间数
int i = l, j = r;
do {
while (a[i] < mid) i++;//查找左半部分比中间数大的数
while (a[j] > mid) j--;//查找右半部分比中间数小的数
if (i <= j)//如果有一组不满足排序条件(左小右大)的数
{
std::swap(a[i], a[j]);//交换
i++;
j--;
}
} while (i <= j);//这里注意要有=
if (l < j) quick_sort(a,l, j);//递归搜索左半部分
if (i < r) quick_sort(a,i, r);//递归搜索右半部分
}
查找第K大元素:
int find_k_big(vector<int>& vec, int left, int right,int k)
{
if (left >= right)
{//只有一个元素
if (left + 1 == k)
return vec[left];
else
return -1;
}
int i = left, j = right, midIndex = (left + right) / 2;
int midVal = vec[midIndex];
do
{
while (vec[i] < midVal)
i++;
while (vec[j] > midVal)
j--;
if (i <= j)
{
std::swap(vec[i], vec[j]);
//更新midIndex
if (i == midIndex)
midIndex = j;
else if (j == midIndex)
midIndex = i;
i++;
j--;
}
} while (i <= j);
if (midIndex + 1 == k)
return vec[midIndex];
else if (midIndex + 1 < k)
find_k_big(vec, i, right, k);
else
find_k_big(vec, left, j, k);
}