【问题标题】:Beginner needing help sorting an array and with calculations初学者需要帮助对数组进行排序和计算
【发布时间】:2017-08-17 04:17:47
【问题描述】:

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

数组正在读取一个包含 1,000 个数字的 data.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()
    {

    }

【问题讨论】:

  • 所以您搜索了整个互联网并没有找到对原始数字数组进行排序的方法?好的:D
  • 你的问题太宽泛了。删除/注释掉代码,直到你有一些可以编译和运行的东西,然后开始添加东西。一次处理一个问题。

标签: c++ arrays definition


【解决方案1】:

迭代开发:

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

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

将 100 放入数组后,您想对其进行排序。冒泡排序是最基本的排序类型,从 0 到 98 在列表(0:99 范围)中移动。查看每对相邻的值,并将最高的值向右交换。这会导致最高值一次“渗透”到顶部。然后,您执行第二次传递,但停止一次短路,第三次传递停止两次短路,依此类推,直到您只是将值 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, 32nds (32x~3.125) 需要 100。低于此值,您将达到分界点,将 32nds 拆分会得到 64ths,即只有 1-2 个元素,因此一旦它们缩小到大小,对值进行冒泡排序会更快3-4,再进行 100 次左右比较。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢。我不知道种类是什么,但我会做我的研究,希望能找到答案。这不是为了家庭作业,我只是在尝试做很多项目来帮助自己理解语言(我听说这是最难的)。所以我从这里开始,以确保我对所有概念都有透彻的了解。
    • 冒泡排序和插入排序是最慢但最容易理解的。合并排序在中间,也很容易理解。对每一半进行排序,然后继续从任一半中取最低值,直到没有剩余为止。输出列表是完整的排序列表。您最初可以使用冒泡排序来使排序的一半得到合并排序工作。然后稍后您将其重写为对一半本身使用合并排序,并使其递归。
    【解决方案3】:

    好吧,如果只是关于排序,比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. std::array
    2. std::sort
    3. std::qsort

    对于原始指针:

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

    【讨论】:

    • 我很确定不允许 OP 使用 STL,无论如何,如果数组衰减为指针,这将无法在 sortArray 函数内工作。
    • 感谢您的回答!我没有介绍数组的 std::sort ,所以我不相信我可以使用它。
    • 如果他不允许,他为什么要写using namespace std;反正std::qsort from C可以用
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2022-01-17
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多