选择问题(Selection Problem):有n个整数,给定一个整数k,找出n个数中第k大的数。
什么意思??? 就是说,给你10个数,让你找出第三大的数
第一种思想:把一堆数读入数组,数组从大到小排序,取第3个数
第二种思想:从一堆数中读入3个数值,把3个元素读入数组,并且排序(从大到小),这里就得到了一个有序序列,让后将剩下的元素一个一个读取到临时变量中,
1,如果读入的数比有序序列最小的数要小或者相等(即比第k个数要小)就什么都不做,直接取读取下一个数,
2,如果读取的数要比有序序列最小的数要大,就把读到的元素插入到有序的序列中(插入排序)
重复以上步骤
注:原有最后(最小)的元素要在插入排序中被覆盖调,这用数组长度就不变了,
然后得到第k个元素(最小元素)
第一种
#include <iostream>
using namespace std;
void fun(int arr[], int i, int j);
int main() {
int a[] = { 3,5,1,7,187,3,1,87 };
fun(a, 0, sizeof(a) / sizeof(int) -1);
for (int i = 0; i < sizeof(a) / sizeof(int) ; i++) {
cout << a[i] << endl;
}
int k = sizeof(a) / sizeof(int)-2;//得到第二大的数
cout << "k的值为=" << a[k];
system("pause");
return 0;
}
void fun(int arr[], int i, int j) {//使用一个快速排序,
int right = j;//
int left = i;//
int temp = 0;//临时变量
temp = arr[left];
if (right <= left) {
return;
}
while (right > left) {
while (arr[righ