Đây là một dạng bài tập đơn giản và tương đối cơ bản giúp cho việc luyện tập code lập trình C/C++ mang lại hiệu quả rất tốt.
Sắp xếp mảng 2 chiều trong lập trình C/C++
Để sắp xếp mảng 2 chiều ta sẽ có 3 kiểu sắp xếp như sau: 1 là sắp xếp từ trái qua phải và từ trên xuống dưới, 2 là chỉ sắp xếp theo hàng, 3 là chỉ sắp xếp theo cột.
Sắp xếp mảng 2 chiều(sắp xếp từ trái qua phải và từ trên xuống dưới)
Để sắp xếp mảng 2 chiều theo cách này ta có 2 cách sắp xếp.
Cách 1: Chuyển đổi mảng 2 chiều thành mảng 1 chiều
Với cách sắp xếp này ta sẽ chuyển đổi mảng 2 chiều thành 1 chiều rồi thực hiện sắp xếp theo mảng 1 chiều. Sau khi đã có mảng 1 chiều theo thứ tự sắp xếp ta lại chuyển ngược lại mảng 1 chiều đã được sắp xếp thành mảng 2 chiều.
Ta code C như sau:
#include <stdio.h>
//Hàm nhập mảng
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
//Hàm xuất mảng
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}
//Hàm sắp xếp mảng 1 chiều
void sortInt(int a[], int n){
int i,j;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++) {
//So sánh phần tử a[i] với a[j] nếu mà a[i] > a[j] thì ta đổi chỗ chúng
if(a[i]>a[j]){ //Nếu muốn sắp xếp giảm ta đổi dấu thành a[i] < a[j]
int temp = a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
}
//Hàm sắp xếp mảng 2 chiều
void Sort(int n, int m, int a[][100]){
int i;
int b[n*m]; //Khai bao biến b 1 chiều kích thước n*m
//Vòng lặp for chuyển mảng 2 chiều thành 1 chiều
for(i=0;i<n*m;i++){
b[i] = a[i/m][i%m];
}
//gọi hàm sắp xếp mảng 1 chiều b
sortInt(b, n*m);
//Sau khi b đã được sắp xếp ta gắn lại giá trị cho mảng 2 chiều a
for(i=0;i<n*m;i++){
a[i/m][i%m] = b[i];
}
//Gọi hàm hiển thị mảng
output(n,m,a);
}
int main()
{
int n, m;
printf("Nhap n, m lan luot: ");
scanf("%d %d", &n,&m);
//Khai báo biến a 2 chiều gôm 100*100 phần tử
int a[100][100];
//Nhap mang
printf("\n------Nhap mang-----\n");
intput(n,m,a);
printf("\n------xuat mang-----\n");
output(n,m,a);
printf("\n------Mang tang dan-----\n");
Sort(n,m,a);
}
Chuyển chương trình thành C++
//Giải thích code xem trên chương trình C
#include <iostream>
using namespace std;
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cin>>a[i][j];
}
}
}
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
void sortInt(int a[], int n){
int i,j;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++) {
if(a[i]>a[j]){
int temp = a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
}
void Sort(int n, int m, int a[][100]){
int i;
int b[n*m];
for(i=0;i<n*m;i++){
b[i] = a[i/m][i%m];
}
sortInt(b, n*m);
for(i=0;i<n*m;i++){
a[i/m][i%m] = b[i];
}
output(n,m,a);
}
int main()
{
int n, m;
cout<<"Nhap n, m lan luot: ";
cin>>n>>m;
//Cap phat bo nho
int a[100][100];
//Nhap mang
cout<<"\n------Nhap mang-----\n";
intput(n,m,a);
cout<<"\n------xuat mang-----\n";
output(n,m,a);
cout<<"\n------Mang tang dan-----\n";
Sort(n,m,a);
}
Cách 2: Sắp xếp trực tiếp trên mảng 2 chiều
Với cách này ta không cần khai báo thêm mảng 1 chiều b tốn thêm bộ nhớ, tuy nhiên khi sắp xếp ta lại lặp tới 4 vòng lặp lồng nhau nên đối với những bạn mới làm quen lập trình khi nhìn vào có thể sẽ tương đối là rối rắm.
Chương trình C
#include <stdio.h>
//Hàm nhập mảng
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
//Hàm xuất mảng
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}
//Hàm sắp xếp
void Sort(int n, int m, int a[][100]){
//2 vòng lặp đầu tiên để duyệt hết tất cả các phần tử
int i, j;
for(i = 0;i<n;i++){
for(j = 0; j<m; j++){
//2 vòng lặp sau để lấy lần lượt các phần tử nằm sau a[i][j] để so sánh với a[i][j]
int k,l;
for(k = i; k<n; k++){
//Biến t để nếu đang cùng hàng thì ta sẽ cho vòng lặp l chạy j+1, nếu khác hàng thì ta duyệt hết hàng đó
int t = 0;
if(k == i) t = j+1;
for(l = t; l<m;l++){
//So sánh phần tử a[i][j] với a[k][l] nếu mà a[i][j] > a[k][l] thì ta đổi chỗ chúng
if(a[i][j] > a[k][l]){ //Để sắp xếp giảm dần ta đổi dấu a[i][j] < a[k][l]
int temp = a[i][j];
a[i][j] = a[k][l];
a[k][l] = temp;
}
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
printf("Nhap n, m lan luot: ");
scanf("%d %d", &n,&m);
//Cap phat bo nho
int a[100][100];
//Nhap mang
printf("\n------Nhap mang-----\n");
intput(n,m,a);
printf("\n------xuat mang-----\n");
output(n,m,a);
printf("\n------Mang tang dan-----\n");
Sort(n,m,a);
}
Chương trình C++
//Giải thích code xem trên chương trình C
#include <iostream>
using namespace std;
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cin>>a[i][j];
}
}
}
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
void Sort(int n, int m, int a[][100]){
int i, j;
for(i = 0;i<n;i++){
for(j = 0; j<m; j++){
int k,l;
for(k = i; k<n; k++){
int t = 0;
if(k == i) t = j+1;
for(l = t; l<m;l++){
if(a[i][j] > a[k][l]){
int temp = a[i][j];
a[i][j] = a[k][l];
a[k][l] = temp;
}
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
cout<<"Nhap n, m lan luot: ";
cin>>n>>m;
int a[100][100];
//Nhap mang
cout<<"\n------Nhap mang-----\n";
intput(n,m,a);
cout<<"\n------xuat mang-----\n";
output(n,m,a);
cout<<"\n------Mang tang dan-----\n";
Sort(n,m,a);
}
Sắp xếp theo hàng
Tức là ta chỉ sắp xếp các phần tử theo các hàng nhất định, hàng này thì không liên quan tới hàng khác.
- Khóa học lập trình C/C++ từ A-Z cho người mới – Giảm giá 40% hôm nay
- Khóa học Java cơ bản dành cho người mới bắt đầu- Giảm 40% hôm nay
- Khóa học lập trình Android từ cơ bản đến thành thạo – Giảm ngay 40%
Chương trình sắp xếp trên C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Hàm nhập mảng
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
//Hàm xuất mảng
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}
//Hàm sắp xếp
void Sort(int n, int m, int a[][100]){
int i, j, k;
for(i = 0;i<n;i++){
for(j = 0; j<m; j++){
for(k = j+1; k<m; k++){
if(a[i][j] > a[i][k]){ //Để sắp xếp giảm dần ta đổi dấu a[i][j] < a[i][k]
int temp = a[i][j];
a[i][j] = a[i][k];
a[i][k] = temp;
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
printf("Nhap n, m lan luot: ");
scanf("%d %d", &n,&m);
int a[100][100];
//Nhap mang
printf("\n------Nhap mang-----\n");
intput(n,m,a);
printf("\n------xuat mang-----\n");
output(n,m,a);
printf("\n------Mang tang dan-----\n");
Sort(n,m,a);
}
Chuyển thành chương trình C++
#include <iostream>
using namespace std;
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cout<<a[i][j]<<" ";
}
printf("\n");
}
}
void Sort(int n, int m, int a[][100]){
int i, j, k;
for(i = 0;i<n;i++){
for(j = 0; j<m; j++){
for(k = j+1; k<m; k++){
if(a[i][j] > a[i][k]){
int temp = a[i][j];
a[i][j] = a[i][k];
a[i][k] = temp;
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
cout<<"Nhap n, m lan luot: ";
cin>>n>>m;
int a[100][100];
//Nhap mang
cout<<"\n------Nhap mang-----\n";
intput(n,m,a);
cout<<"\n------xuat mang-----\n";
output(n,m,a);
cout<<"\n------Mang tang dan-----\n";
Sort(n,m,a);
}
Sắp xếp theo cột
Tức là ta chỉ sắp xếp các phần tử theo các cột nhất định, cột này thì không liên quan tới cột khác.
Chương trình sắp xếp trên C
#include <stdio.h>
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}
void Sort(int n, int m, int a[][100]){
int i, j, k;
for(i = 0;i<m;i++){
for(j = 0; j<n; j++){
for(k = j+1; k<n; k++){
if(a[j][i] > a[k][i]){//Để sắp xếp giảm dần ta đổi dấu a[j][i] < a[k][i]
int temp = a[j][i];
a[j][i] = a[k][i];
a[k][i] = temp;
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
printf("Nhap n, m lan luot: ");
scanf("%d %d", &n,&m);
int a[100][100];
//Nhap mang
printf("\n------Nhap mang-----\n");
intput(n,m,a);
printf("\n------xuat mang-----\n");
output(n,m,a);
printf("\n------Mang tang dan-----\n");
Sort(n,m,a);
}
Chương trình C++
#include <iostream>
using namespace std;
void intput(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
scanf("%d", &a[i][j]);
}
}
}
void output(int n, int m, int a[][100]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++) {
cout<<a[i][j]<<" ";
}
printf("\n");
}
}
void Sort(int n, int m, int a[][100]){
int i, j, k;
for(i = 0;i<m;i++){
for(j = 0; j<n; j++){
for(k = j+1; k<n; k++){
if(a[j][i] > a[k][i]){
int temp = a[j][i];
a[j][i] = a[k][i];
a[k][i] = temp;
}
}
}
}
output(n,m,a);
}
int main()
{
int n, m;
cout<<"Nhap n, m lan luot: ";
cin>>n>>m;
int a[100][100];
//Nhap mang
cout<<"\n------Nhap mang-----\n";
intput(n,m,a);
cout<<"\n------xuat mang-----\n";
output(n,m,a);
cout<<"\n------Mang tang dan-----\n";
Sort(n,m,a);
}
[Xem tất cả bài viết chủ đề C/C++ tại đây]