
BÀI TẬP: ANY PARTITION
Một trong những “phép màu” của thuật toán quick sort là thao tác phân hoạch (gọi nôm na là “phân chia” cũng được) mảng thành 02 phần. Trong đó phần bên trái nhỏ hơn hoặc bằng giá trị pivot và phần bên phải lớn hơn hoặc bằng giá trị pivot.
Hãy viết hàm thực hiện thao tác trên, hàm nhận vào giá trị pivot và mảng a có n phần tử. Hàm thực hiện di chuyển các phần tử trong mảng a
và trả về giá trị p
sao cho:
- tất cả các phần tử từ
a[0]
đếna[p]
có giá trị nhỏ hơn hoặc bằng pivot. Đây goi là phần bên trái của mảng - tất cả các phần tử từ
a[p+1]
đếna[n-1]
có giá trị lớn hơn hoặc bằng pivot. Đây gọi là phần bên phải của mảng
INPUT
Dòng đầu tiên chứa n
và pivot
, lần lượt là số phần tử của mảng cùng giá trị của pivot
n
dòng tiếp theo là các giá trị có trong mảng.
Input sẽ đảm bảo pivot <= max(a)
và pivot >= min(a)
, yêu cầu phải có ít nhất 01 phần tử trong mỗi phần của mảng, không phần nào được rỗng.
OUTPUT
Mảng sau khi phân hoạch xuất trên 01 dòng, cách nhau bởi khoảng trắng
Dòng cuối cùng xuất giá trị p mà hàm phân hoạch trả về.GHI CHÚ: Bài này chỉ cần làm đúng mô tả, không cần phải xuất chính xác 100% như ví dụ vẫn có thể pass.
VÍ DỤ
Input | Output |
50 -97 72 6 -37 83 13 44 14 89 94 79 17 43 -55 -81 59 55 0 -22 39 -15 -29 -82 20 50 12 17 86 -91 98 70 -8 4 -97 29 -31 -43 53 39 -87 75 -84 -97 95 -85 -58 42 -28 -34 -88 45 | -97 -97 -37 83 13 44 14 89 94 79 17 43 -55 -81 59 55 0 -22 39 -15 -29 -82 20 50 12 17 86 -91 98 70 -8 4 72 29 -31 -43 53 39 -87 75 -84 6 95 -85 -58 42 -28 -34 -88 45 1 |
70 -37 -94 70 -85 48 8 -89 -56 -55 -100 99 33 13 -10 -48 -40 -95 96 65 -90 -100 -91 -94 92 -1 56 42 26 33 -22 53 63 50 65 23 -81 96 -85 50 71 -99 92 -46 9 -46 -82 -66 50 -34 -85 16 74 96 -85 -45 -85 -23 41 95 82 8 -13 -24 -37 92 -49 92 -1 17 -58 71 | -94 -85 -89 -56 -55 -100 -48 -40 -95 -90 -100 -91 -94 -81 -85 -99 -46 -46 -82 -66 -85 -85 -45 -85 -37 -49 -58 33 -22 53 63 50 65 23 48 96 8 50 71 70 92 96 9 65 99 33 50 -34 13 16 74 96 -10 92 -1 -23 41 95 82 8 -13 -24 56 92 42 92 -1 17 26 71 26 |
CODE C++:
- int partition (int pivot, int *a, int n)
- {
- int left=0;
- int right=n-1;
- if (left >=right)
- return 0;
- int i=left;
- int j=right;
- do
- {
- while (a[i]<pivot)
- i++;
- while (a[j]>pivot)
- j–;
- if (i<=j)
- {
- int temp=a[i];
- a[i]=a[j];
- a[j]=temp;
- i++;
- j–;
- }
- }
- while (i<j);
- return j;
- }
Leave a Reply