实验题目:
分治法求前k大的数
实验提示:
利用快速排序划分的思想,但对其进行修改,使得每次划分,比轴值小的值在左边,比轴值大的值在右边,因此,划分后轴值所在位置i就表示它在序列中第i大。比较k和i可以得到下面几种情况:
(1)如果k>=i, 表示前i个数都属于前k大的数据中,因此输出所有前i个元素,然后在右侧序列中继续寻找前k大元素;
(2)如果k<i,表示前k大的数包含在前i大的数里,因此在左侧序列中继续寻找前k大的数。
实验代码
#include<iostream>
using namespace std;
void sort_q(int arr[], int l, int r, int k) {
if (l >= r)
return;
int i, j, temp, a;
i = l;
j = r;
temp = arr[i];
while (i != j) {
while (i < j && arr[j] >= temp)
j--;
a = arr[j];
arr[j] = arr[i];
arr[i] = a;
while (i < j && arr[i] < temp)
i++;
a = arr[j];
arr[j] = arr[i];
arr[i] = a;
}
if (r - i + 1 == k)
return;
if (r - i + 1 >= k)
sort_q(arr, i + 1, r, k);
else
sort_q(arr, l, i - 1, k - (r - i + 1));
}
int main() {
int arr[] = { 15,18,77,54,62,32,45,98,56,55,89,157,4,56,96,38,6,18,17,20 };
int i,k, m;
cout << "The squences are:" << endl;
for (i = 0; i < 20; i++) {
cout << arr[i] << " ";
}
cout << endl;
cout << "Input the first large number :" << endl;
cin >> k;
m = sizeof(arr) / sizeof(arr[0]);
sort_q(arr, 0, m - 1, k);
for (i = m - 1; i >= m - k; i--)
cout << arr[i] << " ";
cout << endl;
return 0;
}
运行截图:
但是老师要求截图是这样:
问题出现在哪,不太清楚…