Sortowanie macierzy 10x10 metodą Shella

0

Witam. Mam do napisania program sortujący wiersze macierzy metodą Shella od wyrazu najmniejszego do największego. Napisałem już początek i zamieniłem macierz 10x10 na tablice jednowymiarowe a pózniej dodałem kod z sortowania Shella. Na koniec zamieniam to znowu na dwuwymiarową i wyświetlam w konsoli. Niby nic trudnego, program nie zawiera błędów, a jednak na czymś sie sypie :p Dokładniej w konsoli pokazuje same zera w macierzy. A przed chwilą sprawdzałem, że w tablica[j] są wartości posortowane. To czemu nie pokazuje mi tej zamienionej macierzy ?

 
#include<fstream>
#include<iostream>
#include<iomanip>
#include<conio.h>
using namespace std;

int main()
{
const int n=10, m=10; //wymiary macierzy
int M[n][m]; //deklaracja macierzy
int tablica[100];
int h,i,j,x;
fstream file;
//------------------------------------------------------------------
//odczytanie macierzy z pliku tekstowego
file.open("macierz_do_sortowania.txt",ios_base:: in);
for (int i=0;i<n;i++)
  for (int j=0; j<m; j++)
        file>>M[i][j];
file.close();
//------------------------------------------------------------------
//Przejœcie z tablicy dwuwymiarowej do jednowymiarowej
int t = 0;
for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            tablica[t] = M[i][j];
            t++;
        }
    }
//-----------------------------------------------------------------
//Wyznaczamy wartoœæ pocz¹tkowego przesuniêcia

  for(h = 1; h < 100; h = 3 * h + 1);
  h /= 9;
  if(!h) h++; // istotne dla ma³ych N, dla wiêkszych mo¿na pomin¹æ!
//-----------------------------------------------------------------
//Sortujemy

  while(h)
  {
    for(j = 100 - h - 1; j >= 0; j--)
    {
      x = tablica[j];
      i = j + h;
      while((i < 100) && (x > tablica[i]))
      {
        tablica[i - h] = tablica[i];
        i += h;
      }
      tablica[i - h] = x;
    }
    h /= 3;
  }
//------------------------------------------------------------------
//Przejœcie z tablicy dwuwymiarowej do jednowymiarowej
for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            M[i][j] = tablica[x];
            t++;
        }
    }
//------------------------------------------------------------------
// Wyœwietlamy wynik sortowania
cout << "Po sortowaniu:"<< endl;
for(i = 0; i < 10; i++)
    for(j = 0; j < 10; j++)
    cout << setw(10) << M[i][j];
  cout << endl;
  return 0;

}
1

Jezusiesłodki.
Podziel ten kod na funkcje.

Plus to: for(h = 1; h < 100; h = 3 * h + 1);
Zamień na while.

A sam błąd masz tutaj:

M[i][j] = tablica[x];
t++;
0

Kurcze ale fail :P dzięki. Teraz już pokazuje wyniki, ale teraz drugi problem. Dlaczego te wyniki są takie szalone ? xd W macierzy mam liczby dwu, trzy cyfrowe z minusem lub plusem, a tu wyskakują takie dziwne .... Screen z konsoli w załączniku.

1

A jak poprawiłeś powyższy kod?
Bo jeżeli na:

M[i][j] = tablica[t];
t++;

to nigdzie nie wyzerowałeś zmiennej t i lecisz sobie beztrosko po indeksach 100-199 tablicy stuelementowej i kopiujesz jakiś śmieci, które się za nią znajdują:)

0

Bycie początkującym programistą jest ciężkie xd Teraz już widzę mój błąd, ale samemu do tego dojść jest trudno :p Dzięki wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1