Sắp xếp các phần tử trong mảng tăng dần c++

Nội dung chính

  • Sắp xếp mảng tăng dần trong C bằng hàm qsort
  • Sắp xếp mảng giảm dần trong C bằng hàm qsort
  • Sắp xếp mảng trong C bằng hàm tự tạo
  • Logic sắp xếp mảng
  • Logic hoán đổi phần tử
  • Sắp xếp mảng trong C bằng hàm tự tạo
  • Tổng kết
  • Video liên quan


Run demo:

 bấm vào đây

Hàm sắp xếp mảng tăng giảm dần trong lập trình C

C 2016

#include <stdio.h>
int a[100];

//Khai báo mảng array kích thước 100

int main()

//Hàm thân chạy chương trình bắt buộc có

{ int i,j,n,k;

//Khai báo biến kiểu int

printf(“Nhap so mang cua phan tu: “);

//Hiển thị màn hình

scanf(“%d”, &n);

//Nhập vào số lần lặp

for (i = 0; i < n; i++)

//vòng lặp for

{ printf(“nhap phan tu thu %d: “, i + 1); scanf(“%d”, &a[i]);

//Nhập vào mảng số i

} for (i = 0; i < n-1;i++){ for (j = i+1; j < n;j++){ if (

a[i]>a[j]

)

//Tăng dần or Giảm dần

a[i]<a[j]

{

k = a[i]; //k là biến tạm lưu giá trị a[i] = a[j]; //thực hiện đổi chỗ

lấy a[j]

a[j] = k; //thực hiện đổi chỗ

lấy a[i]

} } } printf(“mang sau khi da sap xep la:\n”); for (i = 0; i < n; i++) { printf(” %d “, a[i]);

//Mỗi lần lặp in ra mảng i

}
}

Kiến Thức Cần Có:
1. Khai báo kiểu int ?
2. Khai báo kiểu Array mảng ? Mảng 1 chiều và mảng 2 chiều là gì?
3. printf là gì?
4. scanf là gì ?
5. Vòng lặp for là gì ?

Xem thêm: Hàm đổi chỗ dùng con trỏ trong lập trình C

 

bấm vào đây

Hướng dẫn cách sắp xếp mảng trong C. Bạn sẽ học được cách sắp xếp phần tử trong mảng C bằng hàm qsort() trong thư viện chuẩn, cũng như cách tự tạo hàm sắp xếp mảng trong C sau bài học này.

Chúng ta có 3 phương pháp để sắp xếp mảng trong C như sau:

  • Sắp xếp phần tử trong mảng C theo thứ tự tăng dần bằng hàm qsort
  • Sắp xếp phần tử trong mảng C theo thứ tự giảm dần dần bằng hàm qsort
  • Sắp xếp mảng trong C bằng hàm tự tạo

Sắp xếp mảng tăng dần trong C bằng hàm qsort

Hàm qsort trong C là một hàm có sẵn trong header file stdlib.h, giúp chúng ta sắp xếp mảng trong C. Cú pháp sử dụng hàm qsort() trong C như sau:

qsort(array, length, size, compare_fuct);

Trong đó:

  • array là mảng cần so sánh
  • length là độ dài (số phần tử) của mảng đó. Xem thêm: Độ dài mảng trong C.
  • size là kích thước một phần tử trong mảng. Ví dụ như kiểu int là 4 byte, char là 1 byte chẳng hạn. Xem thêm: Kiểu dữ liệu trong C.
  • compare_fuct là hàm so sánh để quyết định thứ tự sắp xếp

Để quyết định thứ tự sắp xếp mảng bằng hàm qsort(), chúng ta cần sử dụng tới một hàm trung gian là hàm so sánh compare_fuct giúp tìm ra quan hệ lớn nhỏ giữa hai phần tử.

Trong trường hợp sắp xếp mảng tăng dần trong C thì chúng ta sẽ định nghĩa hàm so sánh này như sau:

int

compareIntAsc

(

const

void

* a,

const

void

* b){

int

aNum = *(

int

*)a;

int

bNum = *(

int

*)b;

return

aNum – bNum;

}

Và chúng ta sử dụng hàm qsort để viết chương trình sắp xếp phần tử trong mảng C theo thứ tự tăng dần như sau:

void

show_array

(

int

array

[],

int

length){

for

(

short

i =

0

; i < length; i++)

printf

(

“%d “

,

array

[i]);

printf

(

“\n”

);

}

int

compareIntAsc

(

const

void

* a,

const

void

* b){

int

aNum = *(

int

*)a;

int

bNum = *(

int

*)b;

return

aNum – bNum;

}

int

main

(

void

){

int

array1[] = {

5

,

4

,

7

,

2

,

8

,

7

,

3

};

int

array2[] = {

99

,

4

,

5

,

2

,

80

,

7

,

3

};

qsort(array1, SIZE_OF_ARRAY(array1),

sizeof

(

int

), compareIntAsc);

qsort(array2, SIZE_OF_ARRAY(array2),

sizeof

(

int

), compareIntAsc);

show_array(array1, SIZE_OF_ARRAY(array1));

show_array(array2, SIZE_OF_ARRAY(array2));

return

0

;

}

Kết quả của phép sắp xếp mảng tăng dần trong C như dưới đây. Bạn hãy thử chạy chương trình và kiểm tra nhé.

2 3 4 5 7 7 8

2 3 4 5 7 80 99

Sắp xếp mảng giảm dần trong C bằng hàm qsort

Như ở phần trên Kiyoshi đã giải thích, thì việc sắp xếp tăng dần hay giảm dần mảng trong C bằng hàm qsort() sẽ phụ thuộc vào hàm so sánh sử dụng trong hàm này.

Do đó, để sắp xếp phần tử trong mảng C theo thứ tự giảm dần dần bằng hàm qsort, chúng ta đơn giản chỉ cần thay đổi hàm so sánh như dưới đây là xong:

int

compareIntDesc

(

const

void

* a,

const

void

* b){

int

aNum = *(

int

*)a;

int

bNum = *(

int

*)b;

return

bNum – aNum;

}

Sự khác biệt giữa 2 hàm so sánh này là ở giá trị mà nó trả về. Với hàm compareIntAsc() ở sắp xếp tăng dần thì chúng ta trả về return aNum – bNum, và với hàm compareIntDesc() ở sắp xếp giảm dần thì chúng ta trả về giá trị ngược lại là return bNum – aNum.

Và chúng ta sử dụng hàm qsort để viết chương trình sắp xếp phần tử trong mảng C theo thứ tự giảm dần như sau:

void

show_array

(

int

array

[],

int

length){

for

(

short

i =

0

; i < length; i++)

printf

(

“%d “

,

array

[i]);

printf

(

“\n”

);

}

int

compareIntDesc

(

const

void

* a,

const

void

* b){

int

aNum = *(

int

*)a;

int

bNum = *(

int

*)b;

return

bNum – aNum;

}

int

main

(

void

){

int

array1[] = {

5

,

4

,

7

,

2

,

8

,

7

,

3

};

int

array2[] = {

99

,

4

,

5

,

2

,

80

,

7

,

3

};

qsort(array1, SIZE_OF_ARRAY(array1),

sizeof

(

int

), compareIntDesc);

qsort(array2, SIZE_OF_ARRAY(array2),

sizeof

(

int

), compareIntDesc);

show_array(array1, SIZE_OF_ARRAY(array1));

show_array(array2, SIZE_OF_ARRAY(array2));

return

0

;

}

Kết quả của phép sắp xếp mảng giảm dần trong C như dưới đây. Bạn hãy thử chạy chương trình và kiểm tra nhé.

8 7 7 5 4 3 2

99 80 7 5 4 3 2

Sắp xếp mảng trong C bằng hàm tự tạo

Chúng ta nên sử dụng hàm qsort() ở trên trong các dự án thực tế khi cần sắp xếp mảng trong C. Tuy nhiên nếu bạn muốn luyện tập viết code C, cũng như muốn hiểu rõ hơn về cách sắp xếp trong C như thế nào, thì hãy thử tự tạo các hàm sắp xếp mảng tăng dần và giảm dần trong C ở phần dưới đây.

Logic sắp xếp mảng

Ví dụ chúng ta có mảng int như sau:

int

array

[] = {

4

,

1

,

0

,

2

,

3

};

Để sắp xếp mảng này tăng dần trong C, chúng ta sử dụng ý tưởng rất đơn giản. Chúng ta xét số đầu tiên của mảng và so sánh lần lượt với các số còn lại từ vị trí số đó tới cuối mảng. Nếu tìm thấy số đầu tiên nhỏ hơn số đang xét thì sẽ hoán đổi vị trí của 2 số này với nhau, rồi tiếp tục lặp cho tới khi không còn số nào nhỏ hơn số đang xét nữa, thì chuyển sang xét ở số thứ 2 trong mảng. Cứ như thế cho tới khi tất cả các số đều được xét.

Với mảng ở trên thì chúng ta sẽ hoán đổi lần lượt như sau:

  1. So sánh số đầu tiên là số 4 lần lượt với các số còn lại. Số 1 là số đầu tiên nhỏ hơn 4 nên hoán đổi vị trí 4 với 1. Lúc này, 1 trở thành số đầu tiên trong mảng.

  2. So sánh 1 lần lượt với các số còn lại. Số 0 là số đầu tiên nhỏ hơn 1 nên hoán đổi vị trí 4 với 1. Lúc này, 0 trở thành số đầu tiên trong mảng.

  3. So sánh 0 lần lượt với các số còn lại. Do không còn số nào nhỏ hơn 0 nữa, nên kết thúc xét số đầu tiên và chuyển sang xét số thứ 2 trong mảng, lúc này là số 4.

  4. Lặp lại qúa trình xét ở trên cho tới số cuối cùng trong mảng.

Cuối cùng, kết quả chúng ta thu về mảng kết quả là {0, 1, 2, 3, 4}.

Với sắp xếp mảng giảm dần trong C, chúng ta cũng sử dụng logic tương tự. Tuy nhiên thay vì tìm số đầu tiên nhỏ hơn số đang xét, thì chúng ta sẽ làm ngược lại là tìm số đầu tiên lớn hơn số đang xét mà thôi.

Logic hoán đổi phần tử

Để có thể hoán đổi 2 phần tử như trên, chúng ta cần phải chuẩn bị một vùng tạm thời để chứa một trong 2 phần tử, và hoán đổi với logic temp = X; X = Y; Y = temp;

Và để thực hiện được logic hoán đổi 2 số ở trên, chúng ta sẽ sử dụng từ khoá define để tạo một macro dùng để hoán đổi phần tử, mà Kiyoshi đã hướng dẫn trong Đảo ngược mảng trong C như sau:

Sắp xếp mảng trong C bằng hàm tự tạo

Ứng dụng các kiến thức trên, chúng ta sẽ viết hàm sắp xếp mảng tăng dần trong Chàm sắp xếp mảng giảm dần trong C như sau:

void

asc_order

(

int

array

[],

int

n){

for

(

int

i =

0

; i < n –

1

; i++){

for

(

int

j = i +

1

; j < n; j++){

if

(

array

[i] >

array

[j]) SWAP(

int

,

array

[i],

array

[j]);

}

}

}

void

desc_order

(

int

*

array

,

int

n){

for

(

int

i =

0

; i < n –

1

; i++){

for

(

int

j = i +

1

; j < n; j++){

if

(

array

[i] <

array

[j]) SWAP(

int

,

array

[i],

array

[j]);

}

}

}

Và chúng ta viết chương trình nhập một mảng và sắp xếp phần tử trong mảng C như sau:

void

show_array

(

int

array

[],

int

length){

for

(

short

i =

0

; i < length; i++)

printf

(

“%d “

,

array

[i]);

printf

(

“\n”

);

}

void

asc_order

(

int

array

[],

int

n){

for

(

int

i =

0

; i < n –

1

; i++){

for

(

int

j = i +

1

; j < n; j++){

if

(

array

[i] >

array

[j]) SWAP(

int

,

array

[i],

array

[j]);

}

}

}

void

desc_order

(

int

*

array

,

int

n){

for

(

int

i =

0

; i < n –

1

; i++){

for

(

int

j = i +

1

; j < n; j++){

if

(

array

[i] <

array

[j]) SWAP(

int

,

array

[i],

array

[j]);

}

}

}

int

main

(

void

){

int

array

[

100

], n;

printf

(

“>>Nhap so phan tu: “

);

scanf

(

“%d”

, &n);

printf

(

“>>Nhap phan tu:\n”

);

for

(

int

i =

0

; i < n; i++)

scanf

(

“%d”

, &

array

[i]);

asc_order(

array

,n);

show_array(

array

, n);

desc_order(

array

,n);

show_array(

array

, n);

return

0

;

}

Kết quả của phép sắp xếp mảng trong C bằng hàm tự tạo sẽ như dưới đây. Bạn hãy thử chạy chương trình và kiểm tra nhé.

>>Nhap so phan tu: 5

>>Nhap phan tu:

4

1

0

55

6

0 1 4 6 55

55 6 4 1 0

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách sắp xếp mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.