K大元素
程序员文章站
2022-07-15 18:59:01
...
没学明白c++ 尝试写中…
T是泛型
最后应该返回个arr[k]之类的,
主要我发现这道题leetcode上题解都是快速排序和堆的…
容我研究一下
下图是从小往大排,题中则是反之
没有return出来 不会c++ 改天再改了
主体算法部分应该没什么问题了
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>
class Solution {
public:
// 将arr[l...mid]和arr[mid+1...r]两部分进行归并
void __merge(T arr[], int l, int mid, int r){
T aux[r-l+1];
//原[l...r],从i开始;现aux[0,r-l+1],从0开始:之间有l的偏移量
for (int i = l ; i <= r ; i ++)//for int i=0 i<=length , i++
//aux[0]= arr[i]aux从0开始,arr从l开始,有l的偏移量。
aux[i-l] = arr[i];
int i = l, j = mid +1;
for( int k = l; k <= r; k ++){
//越界的情况
if ( i > mid ){
arr[k] = aux[j-l];
j ++;
}
else if( j > r ){
arr[k] = aux[i-l];
i ++;
}
else if( aux[i-l] > aux[j-l]){
arr[k] = aux[i-l];
i ++;
}
else{
arr[k] = aux[i-l];
j ++;
}
}
}
// 递归使用归并排序,对arr[l...r]的范围进行排序
void __mergeSort(T arr[], int l, int r){
//这个终止条件,我一开始想错了以为是array元素比大小,在这里我卡了好久,要注意l,r是类似索引,所以l>r,数据集为空
if ( l >= r )
return;
int mid = (l+r)/2;//l+(r-l)/2更好
__mergeSort(arr,l,mid);
__mergeSort(arr,mid+1,r);
__merge(arr, l, mid, r);
}
void mergSort(T arr[], int n){
__mergeSort( arr, 0 , n-1 );//这里是n-1,因为前闭区后闭区间
}
int findKthLargest(vector<int>& nums, int k) {
}
};
上一篇: lombok问题
下一篇: 整数划分,性质一的疑惑,n拆分成k个数