面试题15 - 查找最小的 k 个元素 [数组] / (堆优化 STL O(nlogk) )[STL]

平均复杂度 O(nlogk) 的基于快排的方法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <algorithm>
#define BUG cout << "here\n";
using namespace std;
const int N = 105;

int a[N] = {4, 5, 1, 6, 2, 7, 3, 8};
int partition(int a[], int left, int right) {
    if(left < right) {
        int l = left, r = right, x = a[l];
        while(1) {
            while(l < r && a[r] >= x) r--;
            while(l < r && a[l] <= x) l++;
            if(l >= r) break;
            swap(a[r], a[l]);
        }
        swap(a[left], a[l]);
        return l;
    }
    else return left;
}
void solve(int* input, int n, int k) {
    if(input == NULL || k > n || n <= 0 || k <= 0) {
        return;
    }
    int start = 0;
    int end = n - 1;
    int index = partition(input, start, end);
    while(index != k-1) {
        if(index > k-1) {
            end = index - 1;
            index = partition(input, start, end);
        }
        else {
            start = index + 1;
            index = partition(input, start, end);
        }
    }
    for(int i = 0; i < k; i++) {
        cout << input[i] << ' ';
    }
    cout << endl;
}
int main() {
    solve(a, 8, 5);
    return 0;
}
(堆优化 STL O(nlogk) ) 【STL】 
#include <iostream>
#include <string>
#include <cstdio>
#include <set>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;

typedef multiset<int, greater<int> > intSet; /// 定义容器的
typedef multiset<int, greater<int> >::iterator setIterator;  /// 定义迭代器的

void getLastNumbers(const vector<int>& data, intSet& setK, int k) {
    setK.clear();
    if(k < 1 || data.size() < k) return;
    vector<int>::const_iterator iter = data.begin();
    for(;iter != data.end(); ++iter) {
        if(setK.size() < k) {
            setK.insert(*iter);
        }
        else {
            setIterator iter2 = setK.begin(); // 最大的位置
            if(*iter < (*iter2)) {
                setK.erase(iter2);
                setK.insert(*iter);
            }
        }
    }
    setIterator sit = setK.begin();
    for(;sit != setK.end(); sit++) {
        cout << *sit << ' ';
    }
    cout << endl;
}
int main() {
    vector<int> V;
    V.push_back(4); V.push_back(5); V.push_back(1); V.push_back(6);
    V.push_back(2); V.push_back(7); V.push_back(3); V.push_back(8);
    intSet ms;
    getLastNumbers(V, ms, 5);
    return 0;
}

转载于:https://www.cnblogs.com/robbychan/archive/2013/01/29/3787141.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第三方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值