C++实现随机生成一个整数数组,数组规模N=8,16,32,64,128,256,512,…,数组中的数据为随机生成的1-1000之间的整数,用至少2种算法求数组的第i小元素,i可以由用户输入。
时间: 2024-01-02 12:03:03 浏览: 118
用c++语言来中的随机数的生成
好的,我来为您解答。
首先,我们可以使用C++的标准库中的`rand()`函数生成随机数,并且使用`time(NULL)`函数来作为随机数生成器的种子,以保证每次运行程序时生成的随机数不同。
以下是生成随机数组的代码示例:
```c++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL)); // 设置随机数种子
int n = 8; // 数组初始规模
int i; // 用户输入的i
cout << "请输入i的值:";
cin >> i;
int* a = new int[n]; // 动态分配数组空间
for (int j = 0; j < n; j++)
{
a[j] = rand() % 1000 + 1; // 生成1-1000之间的随机数
cout << a[j] << " ";
}
cout << endl;
// 此处省略数组扩展的代码
// ...
delete[] a; // 释放数组空间
return 0;
}
```
接下来,我们可以使用两种算法来求解数组的第i小元素。
算法一:快速选择算法
快速选择算法是一种基于快速排序的算法,它的时间复杂度为O(n),可以用来求解一个未排序数组中的第k小元素。
以下是快速选择算法的代码实现:
```c++
// 快速选择算法
int quickSelect(int a[], int left, int right, int k)
{
if (left == right) return a[left];
int i = left, j = right;
int pivot = a[(left + right) / 2];
while (i <= j)
{
while (a[i] < pivot) i++;
while (a[j] > pivot) j--;
if (i <= j)
{
swap(a[i], a[j]);
i++;
j--;
}
}
if (k <= j) return quickSelect(a, left, j, k);
if (k >= i) return quickSelect(a, i, right, k);
return a[k];
}
```
在主函数中,我们可以调用快速选择算法来求解第i小元素:
```c++
int i; // 用户输入的i
cout << "请输入i的值:";
cin >> i;
int k = i - 1; // 第i小元素在数组中的下标为i-1
int x = quickSelect(a, 0, n - 1, k);
cout << "第" << i << "小元素为:" << x << endl;
```
算法二:堆排序算法
堆排序算法是一种时间复杂度为O(nlogn)的排序算法,可以用来求解一个未排序数组中的第k小元素。
以下是堆排序算法的代码实现:
```c++
// 堆排序算法
void heapSort(int a[], int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
{
heapify(a, n, i);
}
for (int i = n - 1; i >= 0; i--)
{
swap(a[0], a[i]);
heapify(a, i, 0);
}
}
// 堆化函数
void heapify(int a[], int n, int i)
{
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && a[left] > a[largest])
{
largest = left;
}
if (right < n && a[right] > a[largest])
{
largest = right;
}
if (largest != i)
{
swap(a[i], a[largest]);
heapify(a, n, largest);
}
}
```
在主函数中,我们可以先对数组进行堆排序,然后求解第i小元素:
```c++
int i; // 用户输入的i
cout << "请输入i的值:";
cin >> i;
int k = i - 1; // 第i小元素在数组中的下标为i-1
heapSort(a, n); // 先对数组进行堆排序
int x = a[k]; // 第i小元素即为排序后的第i-1个元素
cout << "第" << i << "小元素为:" << x << endl;
```
综上所述,这就是使用C++实现随机生成一个整数数组,并用快速选择算法和堆排序算法求解数组的第i小元素的完整代码。
阅读全文