经典快排
#include <iostream>
#include <vector>
using namespace std;
void quick_sort(vector<int> &vec, int l, int r) {
if (l < r) {
int i = l, j = r, x = vec[i];
while (i < j) {
while (i < j && vec[j] >= x) j--;
if (i < j) vec[i++] = vec[j];
while (i < j && vec[i] < x) i++;
if (i < j) vec[j--] = vec[i];
}
vec[i] = x;
quick_sort(vec, l, i - 1);
quick_sort(vec, i + 1, r);
}
}
void output(vector<int> &vec) {
int n = vec.size();
if (n == 0) return;
for (int i = 0; i < n - 1; i++)
cout << vec[i] << " ";
cout << vec[n - 1] << endl;
}
int main()
{
vector<int> vec1 = {2, 0, 1, 7, 5, 3, 4, 7, 8};
quick_sort(vec1, 0, vec1.size() - 1);
output(vec1);
return 0;
}
经典堆排
#include <iostream>
#include <vector>
using namespace std;
void adjust(vector<int> &vec, int len, int fa) {
int idx = fa, ma = vec[fa];
int l = fa * 2 + 1, r = fa * 2 + 2;
if (l < len && vec[l] > ma) {
ma = vec[l];
idx = l;
}
if (r < len && vec[r] > ma) {
ma = vec[r];
idx = r;
}
if (idx != fa) {
swap(vec[fa], vec[idx]);
adjust(vec, len, idx);
}
}
void heap_sort(vector<int> &vec) {
int n = vec.size();
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--) {
adjust(vec, n, i);
}
// 调整最大堆
for (int i = n - 1; i >= 1; i--) {
swap(vec[0], vec[i]);
adjust(vec, i, 0);
}
}
void output(vector<int> &vec) {
int n = vec.size();
if (n == 0) return;
for (int i = 0; i < n - 1; i++)
cout << vec[i] << " ";
cout << vec[n - 1] << endl;
}
int main()
{
vector<int> vec2 = {2, 0, 1, 7, 5, 3, 4, 7, 8};
heap_sort(vec2);
output(vec2);
return 0;
}
leetcode hot100 第K大
也是常有的御用面试经典算法题。
给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4],
k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6],
k = 4
输出: 4
提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
class Solution {
public:
void KMax(vector<int>& nums, int l, int r, int k, int &res, bool &find) {
if (find) return;
int n = nums.size();
int i = l, j = r, x = nums[i];
if (l < r) {
while(i < j) {
while (i < j && nums[j] >= x) j--;
if (i < j) nums[i++] = nums[j];
while (i < j && nums[i] < x) i++;
if (i < j) nums[j--] = nums[i];
}
nums[i] = x;
}
if (i == n - k) {
find = true;
res = x;
} else if (i < n - k) KMax(nums, i + 1, r, k, res, find);
else KMax(nums, l, i - 1, k, res, find);
}
int findKthLargest(vector<int>& nums, int k) {
bool find = false;
int res = 0;
KMax(nums, 0, nums.size() - 1, k, res, find);
return res;
}
};