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

时间:2017-03-24 09:34:51

标签: c++ arrays definition

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

数组正在读取一个包含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()
    {

    }

3 个答案:

答案 0 :(得分:0)

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

  1. std::beginstd::end适用于数组
  2. std::sort执行所有其他工作
  3. 所以:

     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
    4. 表示原始指针:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

迭代开发:

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

然后,在100次for循环中,滚动0到999之间的随机数,并将相关值放入较小的数组中。您需要检查一下,相同的值永远不会被取两次。你可以制作1000个bool&#34; value_used&#34;如果使用了特定的输入,则将它们设置为true,如果两次使用相同的输入,则使用while循环重新滚动。

在阵列中拥有100后,您需要对其进行排序。冒泡排序是最基本的排序类型,从0到98移动列表(0:99范围)。查看每个相邻的值对,并将最高的值换成右侧。这导致最高价值&#34;渗透&#34;一次通过顶部。然后你做了第二次传球,但是停了一次,第三次传球停了2次,依此类推,直到你只是将0和1的值进行比较。

但冒泡排序很慢。另一种易于理解的排序类型是Merge Sort。在合并排序中,您可以拆分,例如将您的100个数字分成两个50,然后对每组50个进行排序(可以通过冒泡排序或合并排序本身)。然后,使两个索引指向每个已排序的一半的开头。无论哪一个较低,将其移至输出并推进该指数。结果是一次通过数据输出所有100个已排序的数字。

合并排序可以使用值交换完全实现。或者你可以创建另一个数组并填充它,这避免了不必要地交换值的开销。

BTW与冒泡排序在100个项目上你最终比较大约100 x 100/2 = 5000比较。使用Merge Sort,合并最终列表(100个项目)需要100个比较,合并一半(2x50)也需要100个,四分之一(4x25)需要另外100个,8个(8x~12.5)需要100个,16个(16x~6.25) 100,32(32x~3.125)取100。在下面你达到截止点,分割32位将得到64位,只有1-2个元素,所以一旦它们&#冒出来对它们进行冒泡排序会更快# 39;重新调整到3-4级,再给出100分左右。

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