查找最小的k个元素

来源:互联网 发布:手机彩票程序源码 编辑:程序博客网 时间:2024/06/05 15:37

1. 如果先对元素进行排序,复杂度为O(nlogn)

2. 使用小根堆,复杂度O(n) (建堆复杂度为O(n))

3. 使用类似快排的思想,平均复杂度为O(logn)

代码:

#include <iostream>using namespace std;int partition(int* array, int i, int j) {    int key = array[i];    int left = i, right = j;    while(left < right) {        if(array[left+1] < key) {            array[left] = array[left+1];            left ++;        } else {            int temp = array[right];            array[right] = array[left+1];            array[left+1] = temp;            right --;        }    }    array[left] = key;    return left;}void printMinKeles(int* array, int len, int k) {    // find k mins in array[left, right]    int left = 0, right = len-1;    while(1) {        int p = partition(array, left, right);        int num = p-left+1;        if(num > k) {            right = p-1;        } else {            for(int i = left; i <= p; i++) {                cout << array[i] << " ";            }            if(num == k) break;            k -= num;            left = p+1;        }    }    cout << endl;}int main() {    int array[8] = {1, 2, 3, 4, 5, 6, 7, 8};    printMinKeles(array, 8, 4);    int array1[8] = {8, 6, 7, 4, 3, 5, 2, 1};    printMinKeles(array1, 8, 4);    int array2[8] = {8, 6, 6, 5, 2, 5, 2, 1};    printMinKeles(array2, 8, 4);    return 0;}


原创粉丝点击