Hàm qsort();: Có thể bạn đã biết

Hàm qsort thực hiện thuật giải QuickSort cho C

Mô tả hàm thư viện trong C dùng sắp xếp một mảng được khai báo như sau:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

Đối số

base – Con trỏ trỏ đến đầu mảng cần sắp xếp.

nitems – Số phần tử cần được sắp

size – Kích cỡ từng phần tử trên mảng.

compar – Hàm so sánh giữa 2 phần tử

Hàm không có giá trị trả về

Ví dụ

#include <stdio.h>
#include <stdlib.h>

int values[] = {4,7,2,8,1,6,3};

int cmpfunc (const void * a, const void * b)
{
     return ( *(int*)a - *(int*)b );
}

int main()
{
    int n;

   printf("Day so truoc khi sap xep : \n");
   for( n = 0 ; n < 7; n++ ) {
      printf("%d ", values[n]);
   }

   qsort(values, 7, sizeof(int), cmpfunc);

   printf("\nDay so sau khi sap xep: \n");
   for( n = 0 ; n < 7; n++ ) {
      printf("%d ", values[n]);
   }

   return(0);
}
7 Likes

Hàm qsort là một hàm rất hay trong C. Anh sẽ nói tới hàm này sau khi giới thiệu con trỏ, con trỏ hàm. Vì bài này sử dụng khái niệm con trỏ hàm.

Lúc học C cũng ít người nắm, vì con trỏ hàm nó sau bài con trỏ. Mà thông thường học xong con trỏ là xong hết môn rồi, không học tiếp con trỏ hàm.

7 Likes

Anh Đạt giúp em chỗ này em không hiểu cho lắm .

Lúc đầu a,b là tham số kiểu void* sau đó dùng cast => int*, sau đó nữa * (int*) tức là lấy giá trị mà con trỏ đang trỏ tới.

1 Like

Ý mình là nó sẽ trả về cái gì đó bạn @@

trả về hiệu2 số dưới kiểu int :smiley:

1 Like

theo tôi là nó dang so sánh 2 số a b .
return 0 a = b
return >0 a > b
return <0 a < b

2 Likes

Đúng rồi đó @Thai_Hoc_Nguyen, hàm này có nhiệm vụ so sánh hai số.

1 Like

cho em hỏi vậy khi mình sắp xếp qsort 1 mảng cấu trúc thì sao ạ?
ví dụ em có:

struct doan{
int d,c;
};
doan A[1000];

giờ em muốn sắp xếp tăng dần theo A[i].c của mảng thì phải làm sao ạ???

1 Like

May quá, lúc trước em đọc cuốn Head First C có đề cập đến cái này, còn mấy cái hay hay như hàm muốn truyền bao nhiêu số cũng được,… Nhưng đọc mấy quyển giáo tringf của Việt Nam thì không có mấy cái này.

1 Like

Em chỉ cần so sánh theo A[i].c của từng struct’s entity như trên thôi

int cmpfunc (const void * a, const void * b)
{

  doan*doanA = (doan*)a;
  doan*doanB = (doan*)b;

  return ( doanB ->c - doanA ->c );
}
  doan A[1000];
..............
  qsort (A, 1000, sizeof(doan), cmpfunc );
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?