P
P
parkito2014-02-27 00:25:19
C++ / C#
parkito, 2014-02-27 00:25:19

How to fix the function that distributes the columns of the matrix into an array for sorting?

I am writing a program that sorts a matrix of random values ​​\u200b\u200bwith five sorts.
For A>B The program works with a bang. But as B>A unknown errors which interfere with sorting turn out.

#include<iostream>
#include <ctime>
#include <iomanip>
#include <stdlib.h>
using namespace std;
int A,B;
void upd(int **obs, int  **Arr);
void razbit(int *temp,int **Arr,int **obs);
void display(int **Arr);
void puz(int *temp);
void otbor(int *temp);
void vstav(int *temp);
void Shell(int *temp);
void quick(int *temp, int i, int j);
void table();
int m, k;
int SravPuz=0, NazPuz=0;
int SravOtbor=0, NazOtbor=0;
int SravVstav=0, NazVstav=0;
int SravShell=0, NazShell=0;
int SravQuick=0, NazQuick=0;
int main()
{ 
    srand(time(NULL));
    setlocale(LC_ALL,"Rus");
      cout<<"Введите A --> ";
      cin>>A;
      cout<<"Введите B --> ";
      cin>>B;
    if(A<0||B<0||A%1!=0||B%1!=0)
    {cout<<"Ошибка!"<<endl;
    cin.get();
    cin.get();
    exit(0);
    }
    int *temp=new int[B]; //массив для сортировки каждого столба
      int **Arr = new int* [A]; //изменяемый массив
      for (int i = 0; i < A; i++)
      Arr[i] = new int [B];
      int **obs = new int* [A]; //константный массив
      for (int i = 0; i < A; i++)
      obs[i] = new int [B];

    //Инициализируем массив
    int min=-100,max=100;

      for(int i=0;i<A;i++)
         for(int j=0;j<B;j++)
          obs[i][j]= min + rand() % (max - min); 
    upd(obs, Arr);
    cout<<endl<<"Неотсортированная матрица "<<endl<<endl;
    //Функция для разбиения массива на столбцы
    razbit(temp,Arr,obs);
    table();
  for (int i = 0; i < A; i++)
    delete [] obs[i];
delete [] obs;
for (int i = 0; i < A; i++)
    delete [] Arr[i];
delete [] Arr;
    cin.get();
    cin.get();
      return 0;
}

void upd(int **obs, int  **Arr)
{     for(int i=0;i<A;i++)
         for(int j=0;j<B;j++)
       Arr[i][j]=obs[i][j];
}

void razbit(int *temp,int **Arr,int **obs)
{    
     for(int count = 0;count<=5;count++)
  {  
     //Функция для обновления массива
     display(Arr);cout<<endl<<endl<<endl;
     upd(obs, Arr);
             if (count == 0) cout<<"Сортировка пузырьком "<<endl<<endl;
         else if (count == 1) cout<<"Сортировка вставками "<<endl<<endl;
         else if (count == 2) cout<<"Сортировка отбором "<<endl<<endl;
         else if (count == 3) cout<<"Сортировка Шелла "<<endl<<endl;
         else if (count == 4) cout<<"Сортировка быстрая "<<endl<<endl;
     for(int j=0;j<B;j++)
       {
  	        for(int i=0;i<A;i++)
              {
             temp[i]=Arr[i][j];

            }
         if (count == 0)puz(temp);
         else if (count == 1) otbor(temp); 
         else if (count == 2) vstav(temp); 
         else if (count == 3) Shell(temp);
         else if (count == 4) quick(temp,0,B-1);
      for(int i=0;i<A;i++)
              {
             Arr[i][j]=temp[i];

            }
      
        }
     }
}


void puz(int *temp)
{
    int tmp, i, j;
 
    for(i = 0; i < B - 1 ; ++i) // i - номер прохода
    {
        for(j = 0; j < B - 1; ++j) // внутренний цикл прохода
        { SravPuz++;
            if (temp[j + 1] < temp[j])
            {NazPuz++;
                tmp = temp[j + 1];
                temp[j + 1] = temp[j];
                temp[j] = tmp;
            }
        }
    }
}

void otbor(int* temp) 
{
    int tmp, i, j, pos;
    for(i = 0; i < B; ++i) // i - номер текущего шага
    { 
        pos = i; 
        tmp = temp[i];
        for(j = i + 1; j < B; ++j) // цикл выбора наименьшего элемента
        {SravOtbor++;
            if (temp[j] < tmp) 
            {
               pos = j; 
               tmp = temp[j]; 
            }
        }
    if(temp[pos]!=temp[i])
    NazOtbor++;
        temp[pos] = temp[i]; 
        temp[i] = tmp; // меняем местами наименьший с a[i]
    }
}
void vstav(int* temp) 
{
    int i, j, tmp;
    for (i = 1; i < B; ++i) // цикл проходов, i - номер прохода
    {
        tmp = temp[i];
    SravVstav++;
        for (j = i - 1; j >= 0 && temp[j] > tmp; --j) // поиск места элемента в готовой последовательности 
    { temp[j + 1] = temp[j];  }  // сдвигаем элемент направо, пока не дошли
        if(temp[j + 1] != tmp)
    NazVstav++; 
      temp[j + 1] = tmp; // место найдено, вставить элемент    
    }
  
}
void Shell(int *temp)
{ int step = B / 2;//инициализируем шаг.
    while (step > 0)//пока шаг не 0
    {
      for (int i = 0; i < (B - step); i++)
                {
                    int j = i;
                    //будем идти начиная с i-го элемента
          SravShell++;
                    while (j >= 0 && temp[j] > temp[j + step])
                    //пока не пришли к началу массива
                    //и пока рассматриваемый элемент больше
                    //чем элемент находящийся на расстоянии шага
                    {
                        //меняем их местами
            NazShell++;
                        int tem = temp[j];
                        temp[j] = temp[j + step];
                        temp[j + step] = tem;
                        j--; 
                    }
                }
                step = step / 2;//уменьшаем шаг
            }  }
void quick(int *temp, int i, int j)
{
int c, x,t=0;
m=i; k=j;
c=temp[(m+k) / 2];
do
{SravQuick++;
while (temp[m]<c) m++;
while (temp[k]>c) k--;
if (m<=k)
{if(m!=k)NazQuick++;
x=temp[m];
temp[m]=temp[k];
temp[k]=x;
m++;
k--;
}t++;
} while (m<k);
if(B==1)SravQuick=0;
if (i<k) quick(temp, i, k);
if (m<j) quick(temp, m, j);
}

void display(int **Arr)
{
  for(int i=0;i<A;i++)
    {
    for(int j=0;j<B;j++)
        cout<<setw(5)<<Arr[i][j]<<"  ";
    cout<<endl;
    }
}
void table()
{printf("|Сортировка| Сравнивания| Присвоения|\n");
printf("|----------|------------|-----------|\n");
printf("|  Пузырек | %10i | %10i|\n",SravPuz,NazPuz);
printf("|  Вставка | %10i | %10i|\n",SravVstav,NazVstav);
printf("|   Отбор  | %10i | %10i|\n",SravOtbor,NazOtbor);
printf("|   Шелл   | %10i | %10i|\n",SravShell,NazShell);
printf("|  Быстрая | %10i | %10i|\n",SravQuick,NazQuick);
printf("|----------|------------|-----------|\n");
}

I think that my error is either logical or grammatical in this function
void razbit(int *temp,int **Arr,int **obs)
{    
       for(int count = 0;count<=5;count++)
    {  
       //Функция для обновления массива
       display(Arr);cout<<endl<<endl<<endl;
       upd(obs, Arr);
               if (count == 0) cout<<"Сортировка пузырьком "<<endl<<endl;
               else if (count == 1) cout<<"Сортировка вставками "<<endl<<endl;
               else if (count == 2) cout<<"Сортировка отбором "<<endl<<endl;
               else if (count == 3) cout<<"Сортировка Шелла "<<endl<<endl;
               else if (count == 4) cout<<"Сортировка быстрая "<<endl<<endl;
       for(int j=0;j<B;j++)
         {
            for(int i=0;i<A;i++)
              {
                 temp[i]=Arr[i][j];
 
              }
               if (count == 0)puz(temp);
               else if (count == 1) otbor(temp); 
               else if (count == 2) vstav(temp); 
               else if (count == 3) Shell(temp);
               else if (count == 4) quick(temp,0,B-1);
            for(int i=0;i<A;i++)
              {
                 Arr[i][j]=temp[i];
 
              }
            
          }
       }
}

However, I cannot find it. Please help.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
N
nekipelov, 2014-02-27
@parkito

I advise you to give variables more meaningful names. Names like A, B, m, k, i, j are used when they specifically want to prevent attempts to read the program.
I also advise against using bare pointers. Their use leads to such problems. Why didn't you like std::vector?
I see a couple of errors:

for(int i=0;i<A;i++)
{
    temp[i]=Arr[i][j];
}

for(int i=0;i<A;i++)
{
    Arr[i][j]=temp[i];
}

The temp variable is an array of size B , so if A is larger, an overflow occurs.

P
parkito, 2014-02-27
@parkito

@nekipelov I didn't use the vector because I haven't gone through it yet. After your hint, I changed the dimension of temp. However now errors following: when I enter A = any number, B=1 Sortings do not work. When A < B, something incomprehensible happens with bubble sort. Something weird is going on with bubble sort.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question