Ну, в принципе, можно и так изгаляться.
Но есть вариант попроще.
1. Создаем 2 служебных списка.
2. В один список кладем все положительные числа.
3. Во второй - все отрицательные.
4. Сортируем списки, если надо.
5. Делаем проверку, что нужную последовательность вообще можно составить (число элементов в обоих списках должно быть одинаковым)
6. Составляем новый список, поочередно беря элементы из служебных.
Код:
var
I : Integer;
P, N : Array Of Integer;
D : Integer;
begin
// Prepare
SetLength(P,0);
SetLength(N,0);
// Split source list
For I := 0 To ListBox1.Items.Count-1 Do
Begin
D := StrToInt(ListBox1.Items[i]);
If D > 0
Then Begin SetLength(P,Length(P)+1); P[High(P)] := D; End
Else Begin SetLength(N,Length(N)+1); N[High(N)] := D; End;
End;
// Check lengths
If Length(P) <> Length(N) Then
Raise Exception.Create('ERROR!!!');
// Sort - if needed
...
// Build new list
ListBox1.Items.Clear;
For I := Low(P) To High(P) Do
Begin
ListBox1.Items.Add(IntToStr(P[i]));
ListBox1.Items.Add(IntToStr(N[i]));
End;
end;