找数集中最小k个数

// 如果可以修改原数组,可以使用快排的patition函数
int quick_sort_partition(int a[], int left, int right) {
    if (a == nullptr || left < 0 || right < 0 || left > right) {
        return -1;
    }

    int pivot = a[n-1];
    int i = 0;
    int j = -1;
    for (i=0; i<n; i++) {
        if (a[i] < pivot) {
            i++;
            if (i != j) {
                swap(a[i], a[j]);
            }
        }
    }

    j++;
    swap(a[i], a[j]);
    return j;
}

int least_k_num(int a[], int n, int k) {
    if (a == nullptr || n <= 0 || k <= 0 || k > n) {
        return -1;
    }

    int left = 0;
    int right = n -1;
    int pivot = quick_sort_partition(a, left, right);
    if (pivot < 0) {
        return -1;
    }
    while (pivot != k - 1) {
        if (pivot < k - 1) {
            left = pivot + 1;
        } else {
            right = pivot - 1;
        }
        pivot = quick_sort_partition(a, left, right);
        if (pivot < 0) {
            return -1;
        }
    }

    for (int i = 0; i < k; i++) {
        cout << a[i] << " "
    }
    cout << endl;

    return 0;
}


// 使用最大堆排序,这个方法可以处理大量的数据,以及不需要修改原数组
// 完全二叉树
// i的子节点的2i+1 2i+2, 父节点为(i-1)/2
// 子节点都比父节点小
// 左右子树都是大根堆
// 最大的非叶子节点为(n - 1)/2
// 数组其实为0开始
int creat_max_heap(int a[], int n) {
    if (a == nullptr || n <= 0) {
        return -1;
    }

    for (int i = (n-1)/2; i >= 0; i--) {
        adjust(a, n, i);
    }
}

int adjust(int a[], int n, int i) {
    if (a == nullptr || n <= 0 || i < 0 || i > n) {
        return -1;
    }

    int max = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    if (left < n && a[left] > a[max]) {
        max = left;
    }

    if (right < n && a[right] > a[max]) {
        max = right;
    }

    if (max != i) {
        swap(a[max], a[i]);
        adjust(a, n, max);
    }

    return 0;
}

int least_k_num(int a[], int n, int k) {
    if (a == nullptr || n <= 0 || k <= 0 || k > n) {
        return -1;
    }

    int *max_array = new int[k];
    for (int i = 0; i < k; i++) {
        max_array[i] = a[i];
    }
    int ret = creat_max_heap(max_array, k);
    if (ret < 0) {
        return ret;
    }

    for (int i = k; i < n; i++ ) {
        if (max_array[0] > a[i]) {
            max_array[0] = a[i];
            adjust(a, k , 0);
        }
    }

    for (int i = 0; i < k; i++) {
        cout << max_array[i] << " ";
    }
    cout << endl;

    delete [] max_array;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值