Z tym sortowaniem kubełkowym to chyba będzie tak:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <time.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BucketSort(void)
{
const int WMIN = -99;
const int WMAX = 99;
const int N = 15;
int d[N], lw[WMAX - WMIN + 1], i, j;
/* losowanie liczb do sortowania */
srand((unsigned)time(NULL));
for(i = 0; i < N; i++) d[i] = WMIN + rand() % (WMAX - WMIN + 1);
/* przepisanie liczb do ListBox1 - przed sortowaniem */
for(i = 0; i < N; i++) ListBox1->Items->Add( (String)d[i] );
/* wyzerowanie tablicy */
for(i = WMIN; i <= WMAX; i++) lw[i - WMIN] = 0;
/* zliczanie wystąpień wartości elementów sortowanego zbioru */
for(i = 0; i < N; i++) lw[d[i] - WMIN]++;
/* zapisanie do zbioru wynikowego numerów niezerowych liczników
tyle razy, ile wynosi ich zawartość */
j = 0;
for(i = WMIN; i <= WMAX; i++) while(lw[i - WMIN]--) d[j++] = i;
/* przepisanie liczb do ListBox2 - po sortowaniem */
for(i = 0; i < N; i++) ListBox2->Items->Add( (String)d[i] );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Items->Clear();
ListBox2->Items->Clear();
BucketSort();
}
//---------------------------------------------------------------------------
Nie daję głowy, że to dokładnie to. W przykładzie liczby do sortowania są losowane, no i całość jest mocno uproszczona. Gdyby chodziło o liczby wczytane z pliku, to trzeba by znaleźć wśród nich liczbę najmniejszą i największą by ustalić wartość WMIN i WMAX. To komplikuje sprawę, gdyż potrzebne są kolejne funkcje sprawdzające, która liczba jest najmniejsza, a która największa:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <time.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int TForm1::MIN(TStrings *Lista)
{
int y;
for(int i = 0; i < Lista->Count; i++)
{
int x = Lista->Strings[i].ToInt();
if(y > x)
y = x;
}
return y;
}
//---------------------------------------------------------------------------
int TForm1::MAX(TStrings *Lista)
{
int y;
for(int i = 0; i < Lista->Count; i++)
{
int x = Lista->Strings[i].ToInt();
if(y < x)
y = x;
}
return y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BucketSort(void)
{
const int WMIN = MIN(ListBox1->Items);
const int WMAX = MAX(ListBox1->Items);
const int N = ListBox1->Items->Count;
int *lw = new int[WMAX - WMIN + 1];
int *d = new int[N];
int i, j;
for(i = 0; i < N; i++) d[i] = ListBox1->Items->Strings[i].ToInt();
/* wyzerowanie tablicy */
for(i = WMIN; i <= WMAX; i++) lw[i - WMIN] = 0;
/* zliczanie wystąpień wartości elementów sortowanego zbioru */
for(i = 0; i < N; i++) lw[d[i] - WMIN]++;
/* zapisanie do zbioru wynikowego numerów niezerowych liczników
tyle razy, ile wynosi ich zawartość */
j = 0;
for(i = WMIN; i <= WMAX; i++) while(lw[i - WMIN]--) d[j++] = i;
/* przepisanie liczb do ListBox2 - po sortowaniem */
for(i = 0; i < N; i++) ListBox2->Items->Add( (String)d[i] );
delete [] d;
delete [] lw;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Items->Clear();
ListBox2->Items->Clear();
String sFile = ExtractFilePath( ParamStr(0) ) + "liczby.txt";
ListBox1->Items->LoadFromFile(sFile);
BucketSort();
}
//---------------------------------------------------------------------------
Konstrukcja pliku tekstowego z liczbami:
-17
20
-25
18
1
30
-123
1009
72
95
-58
-46
50
1
2
-2
Liczby oczywiście dowolne, w dowolnej ilości.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.