ภาพรวม
ได้รับอาร์เรย์จำนวนเต็ม arr[] มีทั้งบวกและลบ งานคือจัดเรียงอาร์เรย์ใหม่ให้อิลิเมนต์ทั้งหมดเรียงลำดับ โดยใช้ฟังก์ชัน sort() ในบิลด์ของ C++ STL และเทคนิคการเรียกซ้ำ
ตัวอย่าง
อินพุต − int arr[] = {4, 2, -1, -1, 6, -3, 0}
เอาต์พุต − Rearrangement of positive and negative numbers using inbuilt sort function is: -3 -1 -1 0 2 4 6
คำอธิบาย − อาร์เรย์ขนาด 7 จัดเรียงให้ลบอยู่หน้าบวกอยู่หลัง ได้ -3 -1 -1 0 2 4 6
อินพุต − int arr[] = {-9, -10, 2, 3, 10, 5, 8, 4}
เอาต์พุต − Rearrangement of positive and negative numbers using inbuilt sort function is: -10 -9 2 3 4 5 8 10
คำอธิบาย − อาร์เรย์ขนาด 8 จัดเรียงได้ -10 -9 2 3 4 5 8 10
แนวทางการแก้ปัญหา
1. ใช้ sort()
- รับอาร์เรย์ คำนวณขนาด
- เรียก
Rearrangement(int arr[], int size) - ภายใน เรียก
sort(arr, arr + size)ของ STL - พิมพ์ผลลัพธ์
2. ใช้การเรียกซ้ำ (Recursion)
- รับอาร์เรย์ คำนวณขนาด
- ตัวแปร
tempนับจำนวนลบ - วนนับอิลิเมนต์ < 0 เพิ่ม
temp - เรียก
Rearrangement(arr, 0, size-1)แบบเรียกซ้ำ - เรียก
Rotate(arr, temp, size-1) - ฟังก์ชัน
Rearrangement(arr, first, last):- Base case:
first == lastคืนค่า - เรียกซ้ำ
Rearrangement(arr, first+1, last) - หาก
arr[first] >= 0เรียกRotate(arr, first+1, last)และRotate(arr, first, last)
- Base case:
- ฟังก์ชัน
Rotate(arr, first, last)สลับปลายสองข้างจนfirst >= last - พิมพ์ผลลัพธ์
ตัวอย่างโค้ด C++ - ใช้ sort()
#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int arr[], int size){
sort(arr, arr + size);
}
int main(){
int arr[] = {4, 2, -1, -1, 6, -3, 0};
int size = sizeof(arr)/sizeof(arr[0]);
Rearrangement(arr, size);
cout << "Rearrangement of positive and negative numbers using inbuilt sort function is: ";
for(int i = 0; i < size; i++){
cout << arr[i] << " ";
}
return 0;
}
ผลลัพธ์
Rearrangement of positive and negative numbers using inbuilt sort function is: -3 -1 -1 0 2 4 6
ตัวอย่างโค้ด C++ - ใช้ Recursion
#include <bits/stdc++.h>
using namespace std;
void Rotate(int arr[], int first, int last){
while(first < last){
int temp = arr[first];
arr[first] = arr[last];
arr[last] = temp;
first++;
last--;
}
}
void Rearrangement(int arr[], int first, int last){
if(first == last){
return;
}
Rearrangement(arr, (first + 1), last);
if(arr[first] >= 0){
Rotate(arr, (first + 1), last);
Rotate(arr, first, last);
}
}
int main(){
int arr[] = {4, 2, -1, -1, 6, -3, 0};
int size = sizeof(arr)/sizeof(arr[0]);
int temp = 0;
for(int i = 0; i < size; i++){
if(arr[i] < 0){
temp++;
}
}
Rearrangement(arr, 0, (size - 1));
Rotate(arr, temp, (size - 1));
cout << "Rearrangement of positive and negative numbers using Recursion is: ";
for(int i = 0; i < size; i++){
cout << arr[i] << " ";
}
return 0;
}
ผลลัพธ์
Rearrangement of positive and negative numbers using Recursion is: -1 -1 -3 4 2 6 0