Почему то новички путают индексы при обращении к ячейкам StringGrid.
Первый в квадратных скобках индекс колонки, второй через запятую - строки, а не наоборот, хотя легко увидеть при наведении мышки на слово Cell:
"[ACol : Integer; ARow : Integer]".
Классический "пузырьковый" метод сортировки (или как его назвал автор темы "метод обмена"):
	Код:
	procedure TForm1.Button4Click(Sender: TObject);
var
  i, c, j : integer;
  StopSort : Boolean;
begin
  for I := P downto 0 do begin
    StopSort := True;
    for J := 1 to I do
      if a[J-1] > a[J] then begin //if a[J] > a[J-1] then begin //изменяет порядок сортировки
        c := A[J];
        A[J] := A[J-1];
        A[J-1] := c;
        StopSort := False;
      end;
    if StopSort then Break;
  end;
  for i := 0 to P do
    //!!!в квадр. скобках первым идет индекс колонки,затем индекс строки
    stringGrid1.cells[0, i] := IntToStr(a[i]);
end; 
 
Как у автора сделано тоже работает нормально, только массив помещать в StringGrid надо после сортировки и не путать индексы.