寻找最小的k个数

来源:互联网 发布:虚拟机软件除了vmware 编辑:程序博客网 时间:2024/05/17 12:20

输入n个整数,输出其中最小的k个。

#include <iostream>#include <time.h>using namespace std;/*函数作用:取待排序序列中low、mid、high三个位置上数据,选取他们中间的那个数据作为枢轴*/int median(int arr[], int low, int high) {int mid = low + ((high - low) >> 1); //计算数组中间的元素的下标//使用三数取中法选择枢轴if (arr[mid] > arr[high]) //目标: arr[mid] <= arr[high]{swap(arr[mid], arr[high]);}if (arr[low] > arr[high]) //目标: arr[low] <= arr[high]{swap(arr[low], arr[high]);}if (arr[mid] > arr[low]) //目标: arr[low] >= arr[mid]{swap(arr[mid], arr[low]);}//此时,arr[mid] <= arr[low] <= arr[high]return arr[low];//low的位置上保存这三个位置中间的值//分割时可以直接使用low位置的元素作为枢轴,而不用改变分割函数了}int kth_elem(int a[], int low, int high, int k) {int pivot = median(a, low, high);//要么是选取数组中中位数作为枢纽元,保证最坏情况下,依然为线性O(N)的平均时间复杂度。int low_temp = low;int high_temp = high;while (low < high) {while (low < high && a[high] >= pivot)--high;a[low] = a[high];while (low < high && a[low] < pivot)++low;a[high] = a[low];}a[low] = pivot;//以下就是主要思想中所述的内容if (low == k - 1)return a[low];else if (low > k - 1)return kth_elem(a, low_temp, low - 1, k);elsereturn kth_elem(a, low + 1, high_temp, k);}int main() {int num = 1000;int *array = new int[num];int th = 50;// 随机生成数据srand(unsigned(time(0)));for (int i = 0; i < num; i++)array[i] = rand() * RAND_MAX + rand();int data = kth_elem(array, 0, num - 1, th);cout << th << "th minist data:" << data << endl;cout << th << " minist datas:" << endl;for (int i = 0; i < th; ++i) {cout << array[i] << endl;}return 0;}


1 0
原创粉丝点击