Cho mảng các phần tử khác nhau. Sắp xếp lại thành zig-zag: a < b > c < d > e ...
Input: {4, 3, 7, 8, 6, 2, 1} Output: 3 7 4 8 2 6 1
Giải pháp: Duyệt mảng, dùng flag xen kẽ. Nếu flag=true mong muốn arr[i] < arr[i+1], ngược lại arr[i] > arr[i+1]. Swap nếu không thỏa.
Chương trình minh họa
#include <iostream>
using namespace std;
void convert_zigzag(int arr[], int n){
bool flag = true; // true: <, false: >
for (int i = 0; i <= n-2; i++){
if (flag){
if (arr[i] > arr[i+1]) swap(arr[i], arr[i+1]);
} else {
if (arr[i] < arr[i+1]) swap(arr[i], arr[i+1]);
}
flag = !flag;
}
}
int main(){
int arr[] = {4, 3, 7, 8, 6, 2, 1};
int n = sizeof(arr)/sizeof(arr[0]);
convert_zigzag(arr, n);
for (int i = 0; i < n; i++) cout << arr[i] << " ";
return 0;
}
Kết quả
3 7 4 8 2 6 1