30/09/2018, 16:02

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 : 
");
   for( n = 0 ; n < 7; n++ ) {
      printf("%d ", values[n]);
   }

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

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

   return(0);
}
Nguyễn Minh Dũng viết 18:08 ngày 30/09/2018

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.

Thai Hoc Nguyen viết 18:14 ngày 30/09/2018

return ( (int)a - (int)b );

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

Gió viết 18:03 ngày 30/09/2018

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.

Thai Hoc Nguyen viết 18:09 ngày 30/09/2018

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

Minh Hoàng viết 18:17 ngày 30/09/2018

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

Thai Hoc Nguyen viết 18:14 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:04 ngày 30/09/2018

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

Nguyễn Huỳnh Minh Thanh viết 18:03 ngày 30/09/2018

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 ạ???

Sơn viết 18:02 ngày 30/09/2018

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.

Đỗ Trung Quân viết 18:11 ngày 30/09/2018

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 ạ???

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 );
Bài liên quan
0