算法:线性时间选择
给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数。
做法 :每次对数组进行随机选择一个数(此处我的选择是数组中间点),将其作为节点对其左右两边的数组进行划分,使其左边的部分数组小于其右边的数组,然后返回该数现在的坐标,作为quicksort返回值,然后比较该返回值与题目要求的第k值,如果恰好为该点则返回主函数并输出,若是大于k就在左边数组进行下一次划分,反之则进入右边进行。
#include <stdio.h>
#include <iostream>
using namespace std;
int num[2000010];
// 从小到大排
int part(int left, int right)
{
int r = (left+right)/2;//选择中位数下标
int key = num[r];
swap(num[r], num[left]);// 将选择的数交换到数组首位
while (left < right)
{