如标题,这三个问题的思路其实是一样的。具体的理论知识,大家可以参考剑指offer上面。这里,我只给出C++代码实现。
//寻找数组中第k小的数;
//首先是处理快速排序
int Partition(int *num, int fir, int sec)
{
int temp = num[fir];
int i = fir, j = sec;
while(i<j)
{
while(i<j && num[j]>=temp)
j--;
num[i] = num[j];
while(i<j && num[i]<=temp)
i++;
num[j] = num[i];
}
num[i] = temp;
return i;
}
//然后,遍历寻找合适
int Get_kmini(int *num, int length)
{
int pos = k-1;//第k小的数,从下标看是k-1;
int start = 0;
int end = length - 1;
int index = Partition(num,start,end);
while(pos != index)
{
if (pos < index)
{
end = index - 1;
index = Partition(num,start,end);
}
else
{
start = index + 1;
index = Partition(num,start,end);
}
}
int result = num[pos];
//若是求数组中出现次数大于n/2的元素,则要检查求出的result出现的次数*2是否大于length
return result;
}