初学者需要帮助对数组进行排序和计算

Beginner needing help sorting an array and with calculations

本文关键字:排序 计算 数组 帮助 初学者      更新时间:2023-10-16

我在对数组进行排序并使用输入文件中的数据查找计算代码时遇到问题。任何帮助将不胜感激。我已经搜索了互联网,但仍然遇到很多麻烦。

数组正在读取包含 1,000 个数字的数据.txt文件。该数组应该只随机读取其中的 100 个数字,并对该试验结果执行计算。

任何帮助将不胜感激!

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>
using namespace std;
// Declare global constants
const char* IN_FILE_NAME = "stats.txt";
const char* OUT_FILE_NAME = "results.txt";
const int ELEMENTS = 100;
// Function Prototypes
double findMean(double* elementArray, int ELEMENTS);     // sum of numbers / how many numbers
double findMedian(double* elementArray, int ELEMENTS);    // middle number
double findMinimum(double* elementArray, int ELEMENTS);    //smallest number in the array
double findMaximum(double* elementArray, int ELEMENTS);     //largest number in the array
double findStdDev(double* elementArray, int ELEMENTS);       // sqrt( Sum * | x - mean |^2 ) / number of arrays
bool getTrialElements(std::ifstream& inFile, double* elementArray, int ELEMENTS);
double printTrialResults(std::ofstream& outFile, int trialNumber, double elementArray[], int ELEMENTS);  //print to output file
void sortArray();
// This program performs basic statistics on a large set of data points
int main()
{
// Declare variables
ifstream inFile;
ofstream outFile;
int trialNumber = 0;
double elementArray[ELEMENTS];
// Open input and output files
inFile.open(IN_FILE_NAME);
outFile.open(OUT_FILE_NAME);
// Loop through all of the data sets in the input file
while(getTrialElements(inFile, elementArray, ELEMENTS))
{
// Keep track of the number of data sets processed
trialNumber++;
// Output the results to the output file
printTrialResults(outFile, trialNumber, elementArray, ELEMENTS);
}
// Close input and output files
outFile.close();
inFile.close();
return 0;
}
// Function definitions
double findMean(double elementArray[], int ELEMENTS)
//Find the mean of the array
{
double sum = 0;
for(int ELEMENT = 0; ELEMENT < 100, ELEMENT++)
{
sum = sum + elementArray[ELEMENT];
}
return sum / ELEMENTS;
}
double findMedian(double elementArray[], int ELEMENTS)
{
}
double findMinimum(double elementArray[], int ELEMENTS)
{
}
double findMaximum(double elementArray[], int ELEMENTS)
{
}
double findStdDev(double elementArray[], int ELEMENTS)
{
}
bool getTrialElements(std::ifstream& inFile, double* elementArray, int ELEMENTS)
{
//Read inFile in to elementArray
//for ELEMENTS
//if can't read or no more elements to read, return false, else return true
while(getTrialElements(inFile, elementArray, ELEMENTS))
{
if(ELEMENTS < 99)
{
cout << "No more elements available." << endl;
}
return 0;
}

}
double printTrialResults(std::ofstream& outFile, int trialNumber, double elementArray[], int ELEMENTS)
{
//
}
void sortArray()
{
}

好吧,如果只是关于排序,那么 C++11 有一些工具。

  1. std::beginstd::end适用于数组
  2. std::sort完成所有其他工作

所以:

int array[ELEMENTS]; // look for std::array<int, ELEMENTS>
... // fill array with values
std::sort(std::begin(array), std::end(array)); // sort full array

阅读:

  1. 标准::数组
  2. 标准::排序
  3. 标准::Qsort

对于原始指针:

void sortArray(int *begin, size_t size) 
{
std::sort(begin, begin + size);
}

这看起来像是某种家庭作业,所以最好不要给你一个完整的实现,但我会给你一些提示。 我假设你不太熟悉排序算法,所以考虑查看bubbleSortselectionSortinsertionSort,而不是使用语言中内置的东西。 对数据进行排序后,可以通过返回中间的元素(100 个元素数组的第 50 个元素)来完成中位数查找。 最大值和最小值也可以从排序数组中找到(第一个和最后一个元素),或者您可以选择一个元素作为最小/最大元素,而不是将其与所有其他元素进行比较。如果元素值小于/大于选取的值,则将选取的值更改为元素的值。

int min = arr[0];
for(int i = 0;i < SIZE ;i++){
if(min > arr[i]){
min = arr[i];
}

迭代开发:

首先创建一个数组来保存所有 1000 个数字,然后将文件读入该数组并从数组中打印出来。

然后,在 100 次 for 循环中,将随机数从 0 滚动到 999,并将相关值放入较小的数组中。您需要检查相同的值是否永远不会被取两次。您可以使一个包含 1000 个布尔值的数组"value_used",如果使用特定输入,则将它们设置为 true,如果您两次获得相同的输入,请使用 while 循环重新滚动。

在数组中有 100 后,您希望对其进行排序。冒泡排序是最基本的排序类型,在列表(0:99 范围)中从 0 移动到 98。查看每对相邻的值,并将最高的值交换到右侧。这会导致最高值在单次传递中"渗透"到顶部。然后,您执行第二遍,但停止一次短,第三次通过停止 2 短,依此类推,直到您只是将值 a 0 与值 1 进行比较。

但是气泡排序非常慢。另一种易于理解的排序类型是合并排序。在合并排序中,例如,您将 100 个数字分成两批 50 个,然后对每组 50 个进行排序(可以通过气泡排序或合并排序本身)。然后,制作两个索引,指向每个排序的一半开头。无论哪个较低,请将其移动到输出并推进该索引。结果是一次传递数据,输出所有 100 个排序的数字。

合并排序可以完全就地实现,并进行值交换。或者你可以只制作另一个数组并填充它,这样可以避免不必要地交换值的开销。

顺便说一句,对 100 个项目进行气泡排序,您最终会比较大约 100 x 100/2 = 5000 比较。使用合并排序,合并最终列表(100 个项目)需要 100 个比较,合并两半 (2x50) 也需要 100 个,四分之一 (4x25) 需要另外 100 个,第 8 个 (8x~12.5) 需要 100 个,第 16 个(16x~6.25)需要 100 个,第 32 个 (32x~3.125) 需要 100 个。在此之下,您达到了分界点,拆分第 32 个将给出只有 1-2 个元素的第 64 个元素,因此一旦值减小到 3-4 大小,对它们进行气泡排序会更快,再给出 100 个左右的比较。

这里的规则是合并排序在 O(n * log-n) 时间内工作。由于 2^7 = 128,合并排序将在大约 100 * 7 = 700 的比较中对 100 个值进行排序。