2014-01-25 2 views
1
#include "stdafx.h" 
#include <iostream> 
#include <math.h> 
#include <time.h> 
#include<iomanip> 
#include<array> 
#include <algorithm> 

using namespace std; 
const int AS = 6; 
void FillingRandomly(int [AS][AS]); 
void printing(int[AS][AS]); 
void forsorting(int[][AS], int); 
int c; 

int main() 

{  
    int funny = 0; 
    int timpa = 0; 
    int counter = 0; 
    int Array[AS][AS]; 
    srand(time(0)); 

    FillingRandomly(Array); 

    cout << "The unsorted array is" << endl << endl; 

    printing(Array); 

    cout << "The sorted array is" << endl << endl; 

    forsorting(Array, funny); 
    printing(Array); 

    system("PAUSE"); 

    return 0; 

} 

void FillingRandomly(int Array[AS][AS]) 
{  
    for (int i = 0; i<AS; i++) 
    { 
     for (int j = 0; j<AS; j++) 
      Array[i][j] = rand()%87 +12; 
    } 
} 

void printing(int Array[AS][AS]) 
{  
    int counter = 0; 
    for (int i = 0; i<AS; i++) 
    { 
     for (int j = 0; j<AS; j++) 
     { 
      cout << setw(5) << Array[i][j]; 
      counter++; 
      if (counter%AS == 0) 
       cout << endl << endl; 
     } 
    } 
} 

void forsorting(int Array[AS][AS], int funny) 
{ 

    int w=0; 
    int dice = 0; 
    int Brray[AS*AS]; 
    int super = 0; 
    int space=0; 

    //Transofrming Array[][] into Brray[] 
    for (int i = 0; i < AS; i++) 
    { 
     for (int k = 0; k < AS; k++) 
     { 
      Brray[space] = Array[k][i]; 
      space++; 
     } 
    } 


    //Bubble sorting in Brray[] 

    for (int passer = 0; passer < AS-1; passer++) 
    { 
     for (int timpa = 0; timpa < AS-1; timpa++) 
     { 
      if (Brray[timpa]>Brray[timpa + 1]) 
      { 
       super = Brray[timpa]; 
       Brray[timpa] = Brray[timpa + 1]; 
       Brray[timpa + 1] = super; 
      } 
     } 
    } 

    //Transforming Brray[] into sorted Array[][] 

    for (int j=0;j<AS;j++) 
     for (int i=0;i<AS;i++) 
     { 
      Brray[w]=Array[i][j]; 
     } 

    w++; 

} 

Хорошо, вот мой код. Все, что мне нужно, это сортировка, Ive написала технику сортировки пузырьков, и я дважды проверил свой курс, и это была та же логика. Поэтому я хотел бы знать, почему мой массив не отсортирован, когда я распечатываю его на экране.Проблема с сортировочной матрицей

Спасибо за вашу помощь

+0

Если вы хотите, чтобы люди читали ваш код, пожалуйста, позаботьтесь о его правильном расположении. Ваш отступ сломан, и между линиями слишком много пробелов. – GreenAsJade

+0

Посмотрите на последнюю часть, превратив Brray в отсортированный массив. Может быть, вам нужно назначить Array вместо Brray в двойном? – Noctua

+0

Почему это 2D-массив вместо 1D-массива? –

ответ

3

Это

Brray[w]=Array[i][j];

неправильный путь вокруг.

Вы никогда не пишете в Массив.

2

Одна из проблем, которые у вас есть, заключается в том, что при реализации алгоритма сортировки пузырьков вы принимали общий размер AS, а не AS*AS. Кроме того, ваша реализация даже не проверяет, когда массив уже отсортирован, что приводит к ненужным операциям сравнения. Попробуйте это:

//Bubble sorting in Brray[] 
bool sorted; 
int len = AS*AS-1; 
do 
{ 
    sorted = true; 
    for (int timpa = 0; timpa < len; timpa++) 
    { 
     if (Brray[timpa]>Brray[timpa + 1]) 
     { 
      super = Brray[timpa]; 
      Brray[timpa] = Brray[timpa + 1]; 
      Brray[timpa + 1] = super; 
      sorted = false; 
     } 
    } 
    len--; 
} while (!sorted); 

Кроме того, вы переключили порядок операций присваивания, при перемещении содержимого обратно в 2D массива:

int w = 0; 
for (int j=0;j<AS;j++) { 
    for (int i=0;i<AS;i++) 
    { 
     Array[i][j] = Brray[w]; 
    } 
    w++; 
} 

Я также советую вам разделить логику программы в более общие и управляемые части: две функции для переинтерпретации 2D-массива в 1D-массив (и наоборот), а другой для фактической сортировки. Оба могут принимать массивы переменных размеров, что делает их применимыми к большему количеству проблем в одной и той же программе. Это также относится к функции, которая заполняет массив случайными числами.

Другим полезным советом в случае C++ является объявление переменных о том, где они вам нужны, вместо того, чтобы складывать их в начале функции. См. Переменную w в приведенном выше коде.

+0

@GreenAsJade Действительно, прошу прощения. Вы заслуживаете хотя бы голосования. –

+0

Thx мат. Во что бы то ни стало отредактируйте ваш, чтобы быть полным ответом, это все хорошо - вы добавили дополнительную ценность. Кредит, в котором все кредиты ... это делает это место обойти :) – GreenAsJade

-1

Есть так много вещей неправильно с этим кодом ...

Во-первых, ваша сортировка неправильно. Это будет работать

for (int i = 1; i <= AS*AS; i++) 
    for (int j = 0; j < (AS*AS - 1); j++) 
     if (Brray[j + 1] > Brray[j]) { 
      int temp = Brray[j]; 
      Brray[j] = Brray[j + 1]; 
      Brray[j + 1] = temp; 
     } 

Во-вторых, как уже упоминалось, вы фактически не обновляете свой 2D-массив.

for (int j = 0; j < AS; j++) 
    for (int i = 0; i < AS; i++) 
     Array[j][i] = Brray[w++]; 

В-третьих, вы могли бы просто использовать std::sort, это быстрее, чем пузырьковой сортировки, безопаснее, надежнее и т.д.:

std::sort(std::begin(Brray), std::end(Brray)); 

В-четвертых, есть гораздо лучшие альтернативы, чем сырые массивы. Например, используйте std::vector. Одним из преимуществ является то, что вы можете получить доступ к .size().

В-пятых, не используйте system("pause");. Вместо этого используйте std::cin.get();.

В-шестых, rand() не является точным способом получения равномерно распределенных случайных чисел. Вот лучшая альтернатива:

#include <random> 

// both min and max inclusive 
int rnd(int min, int max) { 

    std::random_device rand_dev;      // create a random device 
    std::mt19937 mt(rand_dev());      // create a mersenne_twister 
    std::uniform_int_distribution<int> dist(min, max); // uniformly distribute between min and max 

    return dist(mt); 

} 

седьмой, using namespace std; плохо.Я позволю вам провести исследование, чтобы выяснить, почему.

Есть еще несколько улучшений, но я думаю, что для вас уже много работы.

+0

Что не так с 'system (" pause ")' в системе Windows? Он дает сообщение, 'cin.get()' does not. Более того - 'cin.get()' может работать некорректно, если 'cin' имеет установленную ошибку. В этом контексте также нет ничего плохого в использовании пространства имен std'. Да, я сделал свое исследование. –

+0

@ PawełStawarz http://stackoverflow.com/questions/1107705/systempause-why-is-it-wrong – Oleksiy

+0

@ PawełStawarz, это медленный, его не переносимый, это плохой стиль: сделать системный вызов нужно только тогда, когда это действительно необходимо , 'cin.get()' лучше во всех отношениях. – Oleksiy

Смежные вопросы