Bài toán: Sắp xếp mảng số nguyên sao cho số chẵn đứng trước số lẻ đứng sau, và không dùng mảng phụ.
Ý tưởng: duyệt toàn bộ mảng, gặp phần tử chẵn đầu tiên thì đổi chỗ nó với phần tử đầu tiên, gặp phần tử chẵn thứ hai thì đổi chỗ nó với phần tử ở vị trí thứ hai, lần lượt làm như vậy thì ta sẽ đưa được tất cả các phần tử chẵn ra ngoài cùng.
Ví du: 7 3 5 6 9 8 4 5
Lần 1: đổi số 6 với 7
-- 6 3 5 7 9 8 4 5
Lần 2: đổi số 8 với 3
-- 6 8 5 7 9 3 4 5
Lần 3: đổi số 4 với số 5
-- 6 8 4 7 9 3 5 5
Code: code này hay ở chỗ số lần đổi chỗ sẽ ít hơn so với một số đoạn code khác. (Bạn hãy tự làm và kiểm chứng xem đúng không nhé)
#include <stdio.h>
#include <conio.h>
int main(){
int *a;
int n;
printf("Mang co bao nhieu phan tu ? ");
scanf("%d",&n);
a = new int[n];
for(int i=0;i<n;i++){
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}
printf("Mang truoc khi sap xep: ");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
//sap xep
for(int i=0;i<n-1;i++)
for (int j=i;j<n;j++){
if (a[j]%2==0){
int t = a[i];
a[i]=a[j];
a[j]=t;
break;
}
}
printf("\nMang sau khi sap xep: ");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
}
Code Phiên bản xem từng bước sắp xếp:
#include <stdio.h>
#include <conio.h>
int main(){
int *a;
int n;
printf("Mang co bao nhieu phan tu ? ");
scanf("%d",&n);
a = new int[n];
for(int i=0;i<n;i++){
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}
printf("Mang truoc khi sap xep: ");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
//sap xep
printf("\n");
for(int i=0;i<n-1 ;i++){
for (int j=i;j<n;j++){
if (a[j]%2==0){
int t = a[i];
a[i]=a[j];
a[j]=t;
break;
}
}
printf("\Lan lap %d: ",i);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
getch();
}