Hier ist eine Implementierung von QuickSort, die ich mit ausführlichen Erklärungen versehen hatte. Statt fData^ kannst du dein Array nehmen. Ich hoffe, du versuchst auch was von den Erklärungen zu verstehen, d.h. wie QuickSort eigentlich funktioniert.
Naja, jedenfalls hänge ich mal auch eines meiner Projekt an, das einige Algorithmen vergleicht, und aus dem dieser Quelltext stammt. Der Quelltext darin ist allerdings zugegebenermaßen stellenweise etwas komplizierter, aber ich hängs trotzdem mal an.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
| function ElementBigger(a, b: Integer): Boolean; begin if fDescending then Result := a < b else Result := a > b; end;
function ElementSmaller(a, b: Integer): Boolean; begin if fDescending then Result := a > b else Result := a < b; end;
procedure DoQuickSort(RangeFrom, RangeTo: Integer); var i, j, MiddleElement, tmp: Integer; begin Inc(CurrentIteration); i := RangeFrom; j := RangeTo; MiddleElement := fData^[(i + j) div 2]; while (i <= j) and not Terminated do begin while ElementSmaller(fData^[i], MiddleElement) do begin Inc(i); Inc(CurrentCompareOps); end; while ElementBigger(fData^[j], MiddleElement) do begin Dec(j); Inc(CurrentCompareOps); end;
if i <= j then begin Inc(CurrentOperation); tmp := fData^[i]; fData^[i] := fData^[j]; fData^[j] := tmp; Inc(i); Dec(j); end; end;
if RangeFrom < j then DoQuickSort(RangeFrom, j); if i < RangeTo then DoQuickSort(i, RangeTo); end;
procedure StartSort; begin if Length(fData^) > 0 then DoQuickSort(0, Length(fData^)); end; |
StartSort ruft die eigentliche Sortierroutine auf. Der Zeiger auf das Array (fData) ist eine Variable in der Klasse TQuickSort. Ob aufsteigend oder absteigend sortiert werden soll wird in fDescending festgelegt.
Ja, ein paar Sachen musst du an dein Programm anpassen...
