Na pewno zastosowany kod sortowania jest mało wydajny. Trzeba by było tutaj użyć QuickSorta, skoro i tak niemal wszystkie zmienne licznikowe są zwiększane to trzeba było by to z głową umieścić w jakimś QuickSortowym algo żeby to miało ręce i nogi. Ja zrobiłem tak jak poniżej. Na pewno jest lepiej niż było. Zasada sortowania jest taka jak pokazał pytający. No ale to On jest znawcą nie ja, więc pewnie wie jak wszystko samemu udoskonalić.
Tylko po co wtedy by pisał na forum? Polecam zatem Bubie zapoznać się z podstawami języka oraz zasadami sensownego nazewnictwa zmiennych i elementów takich jak kontrolki typu TLabel
i w ogóle wszystkiego. Bo z tym w Twoich kodach na prawdę jest masakra. I nie trzeba być znawcą żeby to zauważyć. Oczywiście dopiero w poniższym kodzie tak naprawdę jest zliczany faktyczny czas sortowania, a nie też wczytywanie z pliku i tworzenie wyniku.
A jeszcze tak na koniec w kwestii "znastwa". Nie jestem ekspertem ani zawodowym programistą. Ale na pewno siedzę na tym formu dłuzej od Ciebie. Widziałem więcej kodów tutaj, a i podejrzewam że i więcej w życiu napisałem w Delphi. Dlatego wiem, że można zrobić to, co chcesz zrobić tak jak poniżej. Albo w ogóle przepisać wszystko na nowo z wydajnym algorytmem sortującym i wedle zaleceń Poprzednika.
Oczywiście do posortowania wierszy można wykorzystać sam obiekt TStringList
. Istnieją do tego gotowe metody. Więcej opisów znajdź w Google.
//...
const
Output_FileName = 'posortowaniu.txt';
Input_FileName = 'przedsortowaniem.txt';
var
I, J, N, X : integer;
InputSL, OutputSL : TStringlist;
Start, Stop, Elapsed : Cardinal;
Arr : array[0..100000] of integer;
IntLicznikZamian, IntLicznikPorownan1, IntLicznikPorownan2 : integer;
begin
if not FileExists(Input_FileName) then
begin
ShowMessage('Plik: "' + Input_FileName + '" nie istnieje!');
end
else
begin
InputSL := TStringlist.Create;
InputSL.LoadFromFile(Input_FileName);
if InputSL.Count > Length(Arr) then
begin
ShowMessage('Plik: "' + Input_FileName + '" zawiera zbyt dużą ilośc linii!');
end
else
begin
N := 0;
for I := 0 to InputSL.Count - 1 do
begin
if not TryStrToInt(InputSL[I], Arr[N]) then
begin
ShowMessage('Błąd w linii: ' + IntToStr(I + 1) + '! "' + InputSL[I] + '" nie jest liczbą całkowitą!');
end
else
begin
N := N + 1;
end;
end;
InputSL.Free;
IntLicznikZamian := 0;
IntLicznikPorownan1 := 0;
IntLicznikPorownan2 := 0;
Start := GetTickCount;
for J := N - 1 downto 0 do
begin
X := Arr[J];
Inc(IntLicznikPorownan1);
I := J + 1;
while (I < N) and (X > Arr[I]) do
begin
Inc(IntLicznikPorownan2);
Arr[I - 1] := Arr[I];
Inc(I);
Inc(IntLicznikZamian);
end;
Arr[I - 1] := X;
end;
Stop := GetTickCount;
Elapsed := Stop - Start;
OutputSL := TStringList.Create;
for I := 0 to N - 1 do
begin
OutputSL.Add(IntToStr(Arr[I]));
end;
OutputSL.SaveToFile(Output_FileName);
OutputSL.Free;
RowsCountLab.Caption := IntToStr(N);
NumberOfDifferencesLab.Caption := IntToStr(IntLicznikPorownan1 + IntLicznikPorownan2);
NumberOfChangesLab.Caption := IntToStr(IntLicznikZamian);
ShowMessage('Czas wykonania sortowania: ' + IntToStr(Elapsed) + ' ms.');
end;
end;
end;
//...