Cho một mảng 0, 1 và 2 sắp xếp phần tử theo thứ tự sao cho tất cả các số không đứng trước 1 và cuối cùng là tất cả 2. Chúng ta phải sắp xếp tất cả các phần tử của mảng tại chỗ.
Chúng ta có thể giải quyết vấn đề này bằng cách sử dụng Thuật toán sắp xếp DNF (Quốc kỳ Hà Lan). Ví dụ,
Đầu vào-1 -
arr[ ]= {2,0,0,1,2,1 }
Đầu ra -
0 0 1 1 2 2
Giải thích - Sắp xếp mảng đã cho gồm các phần tử chứa 0,1 và 2 bằng Thuật toán sắp xếp DNF, nó sẽ in ra kết quả là {0,0,1,1,2,2}.
Đầu vào-2 -
arr[ ] = {0,1,1,2,1,1,0}
Đầu ra -
0 0 1 1 1 1 2
Giải thích - Sắp xếp mảng đã cho gồm các phần tử chứa 0,1 và 2 bằng Thuật toán sắp xếp DNF, nó sẽ in ra kết quả là {0,0,1,1,1,1,2}.
Phương pháp tiếp cận để giải quyết vấn đề này
Trong mảng 0, 1 và 2 đã cho, chúng ta có thể sử dụng thuật toán sắp xếp DNF.
Thuật toán sắp xếp DNF - Thuật toán yêu cầu 3 con trỏ lặp lại trong toàn bộ mảng bằng cách hoán đổi các phần tử cần thiết.
-
Tạo một con trỏ thấp ở đầu mảng và một con trỏ cao trỏ vào cuối mảng.
-
Tìm Điểm giữa của mảng và tạo một con trỏ giữa cũng như lặp lại từ đầu mảng cho đến cuối mảng.
-
Nếu con trỏ giữa của mảng là ‘0’, thì hãy hoán đổi phần tử trỏ xuống thấp. Tăng con trỏ thấp và con trỏ giữa.
-
Nếu con trỏ giữa của mảng là ‘2’, thì hãy hoán đổi nó với phần tử trỏ ở mức cao. Tăng con trỏ giữa và giảm con trỏ cao.
-
Nếu con trỏ giữa của mảng là ‘1’, thì hãy tăng con trỏ giữa.
Ví dụ
public class Solution { public static void binarySorting(int arr[], int n){ int low=0; int high= n-1; int mid=0; while(mid<=high){ if(arr[mid]==0){ int temp= arr[mid]; arr[mid]= arr[low]; arr[low]= temp; mid++; low++; } if(arr[mid]==1){ mid++; } if(arr[mid]==2){ int temp= arr[mid]; arr[mid]= arr[high]; arr[high]= temp; high--; } } } public static void print(int arr[], int n){ for (int i = 0; i < n; i++) System.out.print(arr[i] +" "); } public static void main(String[] args){ int arr[] ={ 0,0,1,0,1,0,1,2,2}; int n = arr.length; binarySorting(arr, n); print(arr, n); } }
Đầu ra
Chạy đoạn mã trên sẽ tạo ra kết quả là,
0 0 0 0 1 1 1 1 2