Một trong các thuật toán sắp xếp đơn giản nhất là thực hiện so sánh hai phần tử liền kề với nhau và nếu chúng chưa theo thứ tự cần sắp thì đổi chỗ của chúng với nhau. Quá trình này lặp lại cho đến khi không còn cặp nào thoả mãn thì dừng.
a/ Thuật toán tuần tự: sắp xếp mảng a[n] theo thứ tự tăng dần for(i=n-1; i > 0; i--) for(j=0; j < i; i++) { k = j + 1; if(a[j] > a[k]) { temp = a[j]; a[j] = a[k]; a[k] = temp;
}
b/ Thuật toán song song:
Chúng ta có thể sử dụng n tiến trình kết hợp theo nguyên lý hình ống để sắp xếp mảng a[n]. Hệ thống được chia thành hai pha: pha chẵn và pha lẻ.
Pha chẵn: các tiến trình được đánh số chẵn so sánh với những tiến trình tiếp theo (tiến trình có số lẻ), nếu nó giữ phần tử lớn hơn thì đổi dữ liệu với tiến trình đó.
Pha lẻ: các tiến trình có số lẻ hoạt động tương tự như trên. Ví dụ: n = 8 và dãy số ban đầu là 4, 2, 7, 8, 5, 1, 3, 6.
Hình 1.25 Sắp xếp theo nguyên lý ống
Ở pha thứ 6 và 7, không có cặp nào phải đổi chỗ do vậy thuật toán dừng và cho kết quả là một dãy được sắp xếp. Trong hình 5-4, mũi tên hai chiều đứt nét để chỉ những cặp so sánh với nhau nhưng không cần đổi chỗ, còn mũi tên nét liền là phải đổi giá trị cho nhau.
Giả thiết dữ liệu được lưu ở những tiến trình chẵn là B và ở những tiến trình lẻ là A. Thuật toán song song theo hình ống được mô tả trong mô hình truyền thông điệp như sau:
a/ Pha chẵn
Pi, i = 0, 2, 4, ..., n-2 (chẵn) Pi, i = 1, 3, 5, ..., n-3 (lẻ)
recv(&A, Pi+1); send(&A, Pi-1);
send(&B, Pi+1); recv(&B, Pi-1);
if(A > B) B = A; if(A > B) A = B;
b/ Pha lẻ
Pi, i = 1, 3, 5, ..., n-3 (lẻ) Pi, i = 0, 2, 4, ..., n-2 (chẵn)
send(&A, Pi+1); recv(&A, Pi-1);
if(A > B) A = B; if(A > B) B = A;
Trong cả hai trường hợp, các tiến trình (bộ xử lý) được đánh số lẻ đều gọi hàm send() sau đó mới gọi recv(). Kết hợp lại chúng ta được thuật toán song song:
Pi, i = 1, 3, 5, ..., n-3 (lẻ) Pi, i = 0, 2, 4, ..., n-2 (chẵn)
send(&A, Pi-1); recv(&A, Pi+1);// pha chẵn
recv(&B, Pi-1); send(&B, Pi+1);
if(A > B) A = B; if(A > B) B = A;
if(i <= n-3){ if(i >= 2){
send(&A, Pi+1); recv(&A, Pi-1);// pha lẻ
recv(&B, Pi+1); send(&B, Pi-1);
if(A > B) A = B; if(A > B) B = A;
} }
Thuật toán này có độ phức tạp O(n).