一、实验目的
1. 掌握数组、堆等数据结构的操作;
2. 掌握⽤c++语⾔描述与实现算法的⽅法;
3. 理解算法的概念,掌握算法复杂度分析技术;
二、实验内容
1. 运⽤C++语⾔,按要求完成算法实现;
2. 对所设计的算法采⽤⼤O符号进行时间复杂性分析;
三、实验任务
问题描述: 随机⽣成任意n个元素,现要在这n个元素中找出⼀特定元素 x。 要求: 利⽤堆完成元素排序;
输⼊: 输⼊包括若⼲个⽤例,第⼀⾏为⼀个正整数 n,表示⽤例个数,接下来每个⽤例 占⼀⾏,分别为正整数 k 和 x,表示 k 个元素,要求查找 x; 根据输⼊的k,随机⽣成数组, 数组元素的取值范围为[1~k];
输出: 每个⽤例⽤⼀⾏输出找出的元素的位置和⽐较次数,⽤⼀个空格隔开,如果不存 在,则位置⽤ 0 表示。
样例输入:
4
50 3
80 7
100 40
300 8
样例输出(模拟):
3 1
0 3
0 4
3 2
代码
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
void HeapAdjust(int* arr, int start, int end)
{
int tmp = arr[start];
for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)
{
if (i < end && arr[i] < arr[i + 1])
{
i++;
}
if (arr[i] > tmp)
{
arr[start] = arr[i];
start = i;
}
else
{
break;
}
}
arr[start] = tmp;
}
void HeapSort(int* arr, int len)
{
for (int i = (len - 1 - 1) / 2; i >= 0; i--)
{
HeapAdjust(arr, i, len - 1);
}
int tmp;
for (int i = 0; i < len - 1; i++)
{
tmp = arr[0];
arr[0] = arr[len - 1 - i];
arr[len - 1 - i] = tmp;
HeapAdjust(arr, 0, len - 1 - i - 1);
}
}
void Rarr(int *arr, int len, int minn, int maxn) {
srand(time(0));
for (int i = 0; i < len; i++) {
arr[i] = minn + rand() % (maxn - minn + 1);
}
}
int binarySearch(int arr[], int left, int right, int target,int &cnt) {
while (left <= right) {
int mid = left + (right - left) / 2;
cnt++;
if (arr[mid] == target) {
return mid;
}
if (arr[mid] < target) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
void solve() {
int k, x,cnt=0;
cin >> k >> x;
int* arr = new int[k];
Rarr(arr, k, 1, k);
HeapSort(arr, k);
int ind = binarySearch(arr, 0, k - 1, x, cnt);
ind = (ind == -1) ? 0 : ind + 1;
cout << "排序后的数组为:";
for (int i = 0; i < k; i++)
{
cout << arr[i] << ' ';
}cout << endl;
if (ind==0)cout << x << "不存在于数组中 比较次数为:" << cnt << endl;
else cout <<x<<"的位置为:"<<ind <<" 比较次数为:" << cnt << endl;
delete[] arr;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}