资料:
1. 快速排序:
自己写的:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型vector
* @param n int整型
* @param K int整型
* @return int整型
*/
int partition(vector<int>& a, int left, int right){
// 1.快慢指针、2.单向调整、3.双向调整
// 单向调整代码简单:
int temp;
int i = left;
for(int j = left; j < right; j ++){
if(a[j] > a[right]){ //在这里调整序列是升序还是降序
temp = a[i];
a[i] = a[j];
a[j] = temp;
i ++;
}
}
temp = a[i];
a[i] = a[right];
a[right] = temp;
return i;
}
void Sort(vector<int>& a, int left, int right){
if(left >= right)
return;
int mid = partition(a, left, right);
Sort(a, left, mid-1); //如果左边没值,那么mid是left
Sort(a, mid+1, right); //如果右边没值,那么mid是right
}
int findKth(vector<int>& a, int n, int K) {
// write code here
Sort(a, 0, n-1); //right是有效的,是a.size()-1,不是a.size()
return a[K-1];
}
};
模板的:
- partition分区时,采用的双向调整方法。细节:不交换两个指针的值,而是直接替换。比知乎的更节省计算量一点。
- Sort排序时,细节:判断是否是第k大,直接返回、直接递归左侧、或直接递归右侧,减少计算复杂度。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型vector
* @param n int整型
* @param K int整型
* @return int整型
*/
int partition(vector<int>& a, int left, int right){
// 1.快慢指针、2.单向调整、3.双向调整
// 双向调整代码(且比知乎的更节省计算量一点):
int temp = a[left];
while(left < right){
while(left < right && a[right] <= temp)
right --;
// 目前,停下来的a[right]一定是要被替换的,但是a[right]要先去替换别人
if(left >= right)
break;
a[left] = a[right];
while(left < right && a[left] >= temp)
left ++;
// 目前,停下来的a[left]一定是要被替换的,但是a[left]要先去替换别人
if(left >= right)
break;
a[right] = a[left];
}
a[left] = temp;
return left;
}
int Sort(vector<int>& a, int left, int right, int K){
int mid = partition(a, left, right);
// 判断是否是第k大,减少计算复杂度!!
if (mid - left == K - 1)
return a[mid];
else if(mid - left > K - 1)
return Sort(a, left, mid-1, K);
else
return Sort(a, mid+1, right, K - (mid - left + 1));
}
int findKth(vector<int>& a, int n, int K) {
// write code here
return Sort(a, 0, n-1, K);
}
};