[C++] Pozycyjne porządkowanie liczb

Awatar użytkownika
Hajtowy
Użytkownik
Użytkownik
Posty: 754
Rejestracja: 12 wrz 2010, o 10:47
Płeć: Mężczyzna
Lokalizacja: PL
Podziękował: 213 razy
Pomógł: 5 razy

[C++] Pozycyjne porządkowanie liczb

Post autor: Hajtowy »

Witajcie.

Mam do napisania program w C++ Builder 6.

Używając komponentu ListBox jako listy liczb, napisz program sortujący liczby od najmniejszej do największej poprzez pozycjonowanie liczb.

Kod: Zaznacz cały

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->ListBox1->Clear();
randomize();
int i;
for (i=0;i<15;i++)
Form1->ListBox1->Items->Add(random(100000));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int max = Form1->ListBox1->Items->Strings[0].Length();
for(int i = 0; i < Form1->ListBox1->Items->Count; i ++)
{
if(Form1->ListBox1->Items->Strings[i].Length() > max)
    max = Form1->ListBox1->Items->Strings[i].Length();
}


for(int i = 0; i < Form1->ListBox1->Items->Count; i ++)
{
while(Form1->ListBox1->Items->Strings[i].Length() != max)
{
 Form1->ListBox1->Items->Strings[i] = "0" + Form1->ListBox1->Items->Strings[i];
}
}
String first, secound;
int ileOdjac = 0;
for(int j = 0; j < Form1->ListBox1->Items->Count-1; j ++)
{
for(int i = 0; i < Form1->ListBox1->Items->Count-1; i ++)
{
 first = Form1->ListBox1->Items->Strings[i];
 secound = Form1->ListBox1->Items->Strings[i+1];
 if(max - ileOdjac > 0 )
 {
  if(first[max - ileOdjac] > secound[max - ileOdjac])
  {

  Form1->ListBox1->Items->Move(i,i+1);
  }

 }
}
ileOdjac++;
}
}
//---------------------------------------------------------------------------
Coś w 2 przycisku jest źle ...

PODPOWIEDŹ :
Pozycyjne porządkowanie liczb odbywa się wg prostego algorytmu :
* "dosuń" liczby do prawej,
* porządkuj je po kolei zaczynając od jedności, dziesiątek, setek itd. (jeżeli w którejś liczbie brakuje cyfry przyjmuje się ją za 0 )
np.
1235
0456
6023
0085
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Pozycyjne porządkowanie liczb

Post autor: royas »

Coś jest nie tak w samym algorytmie sortowania. Rozumiem że chciałeś jakoś użyć bublesorta. Obrazowo w bublesorcie, zewnętrzna pętla wykonuje się dla każdego bąbelka, a wewnętrzna to uciekanie bąbelka na powierzchnie. Ten warunek if(max - ileOdjac > 0 ) wrzucony do wewnętrznej pętli powoduje, że jeśli np. jest 10 liczb, o długości max 4, to po 4 przebiegach zewnętrznej pętli (czyli ucieczce 4 bąbelków) sortowanie całkiem się wyłącza. Czyli 6 liczb pozostaje nieposortowanych.

Wydaje mi się, że to sortowanie powinno mieć taki zarys:

Kod: Zaznacz cały

for k=max to 0
  sortuj stringi wg k-tego znaku.
Awatar użytkownika
Hajtowy
Użytkownik
Użytkownik
Posty: 754
Rejestracja: 12 wrz 2010, o 10:47
Płeć: Mężczyzna
Lokalizacja: PL
Podziękował: 213 razy
Pomógł: 5 razy

[C++] Pozycyjne porządkowanie liczb

Post autor: Hajtowy »

Już zrobiłem

Thx za pomoc.
ODPOWIEDZ