chim bay

Image 1
Image 2
Image 3
Image 4

Saturday, December 19, 2015

Cách Sử Dụng Các Lênh ADB Android Cơ Bản


1. Kết nối: cài driver đầy đủhttp://csmgdl.lgmobile.com/swdata/c...leDriver_S4981MAN38AP22_ML_WHQL_Ver_3.8.1.exe
- Tải adb.
- Kết nối điện thoại vơi máy tính, chọn chế độ Charge only khi máy còn bật được, khi máy không khởi động được thì vào recovery.
- Nếu kết nối bằng Charge only, phải chọn Usb Debugging trong Developers options.
- Giữ shift và nhấn chuột phải vào thư mục chưa file adb, chọn Open Command.

Với Windows XP hình như không có cái này, các bạn chịu khó vào run, gõ cmd rồi di chuyển tới thư mục chứa adb: ví dụ để adb trong D:\adb
Mã:
cd /d D:\adb
- Kiểm tra xem máy đã kết nối được chưa bằng lệnh
Mã:
adb devices
Trước khi đọc tiếp, cần chú ý
- Khi chỉnh sửa những file hệ thống, cần remount lại với quyền read-write (phần 3)
- Khi gõ đường dẫn, trong mọi trường hợp tốt nhất luôn phân biệt chữ hoa/thường, kể cả đường dẫn trong Windows.
- Nếu trong đường dẫn có dấu "cách" (space) thì đường dẫn phải để trong ngoặc kép, ví dụ: D:\mod\a.apk (ok); D:\rom mod\a.apk (không được); "D:\rom mod\a.apk" (ok)
- Có thể kéo thả file vào cửa sổ Command Prompt để lấy đường dẫn của file đó luôn.
- Trong đường dẫn đến file hoặc folder, có thể dùng dấu sao "*" để đại diện cho một chuỗi ký tự bất kỳ, dấu hỏi chấm "?" để đại diện cho một ký tự bất kỳ. Ví dụ *.apk là đại diện cho tất cả những file có đuôi là .apk. Điều này cần thiết khi thao tác với nhiều file (nếu chưa rõ có thể xuống phần 4 đọc ví dụ).​

2. Lệnh cơ bản
  • Copy file (folder) từ máy tính vào điện thoại: ví dụ file SystemUI.apk trong thư mục "D:\rom mod" vào /system/app
Mã:
 adb push "D:\rom mod\SystemUI.apk" /system/app
  • Lấy file (folder) từ điện thoại ra máy tính: ví dụ SystemUI.apk từ /system/app ra D:\rom mod
Mã:
adb pull /system/app/SystemUI.apk "D:\rom mod"
  • Cài file apk trực tiếp vào điện thoại: ví dụ cài RootExplorer.apk
    Mã:
    adb install D:\app\RootExplorer.apk
    Nếu trong máy có cài RootExplorer rồi mà muốn cài đè thì
    Mã:
    adb install -r D:\app\RootExplorer.apk
    Cài vào thẻ nhớ thay vì bộ nhớ trong
    Mã:
    adb install -s D:\app\RootExplorer.apk
  • Lấy logcat: vì là hướng dẫn cơ bản nên mình chỉ hướng dẫn lấy một kiểu. Ví dụ: lấy logcat rồi lưu ra file a.txt cùng thư mục chưa adb
    Mã:
    adb logcat > a.txt
    Gõ lệnh xong đợi khoảng 5s rồi ấn Ctrl + C để kết thúc.
  • Khởi động lại:
- Bình thường
Mã:
adb reboot
- Khởi động lại vào bootloader
Mã:
adb reboot bootloader
- Khởi động lại vào recovery
Mã:
adb reboot recovery
- Khởi động lại vào download mode
Mã:
adb reboot download
3. adb shell: thực hiện một số lệnh cơ bản của linux
Vào shell:
Mã:
adb shell
. Mọi lệnh dưới đây mình nói chỉ chạy được khi bạn đã vào shell.
Chú ý: mọi lệnh trong shell có thể được dùng nhanh từ adb:
Mã:
adb shell [lệnh_shell]
  • Di chuyển đến thư mục: ví dụ đến /system/app
    Mã:
    cd /system/app
  • Danh sách file trong thư mục hiện hành: ví dụ các file trong /system/app
    Mã:
    ls /system/app
  • Quyền root, để chỉnh sửa hệ thống, như mấy ví dụ dưới muốn sửa gì trong /system đều phải dùng lệnh này trước
    Mã:
    su
  • Mount với quyền read-write: khi muốn thay đổi gì trong hệ thống phải dùng lệnh này trước
    Mã:
    mount -o remount,rw /system
  • Copy: ví dụ /sdcard/a.apk muốn copy sang /system/app
    Mã:
     cp /sdcard/a.apk /system/app
    Nếu muốn copy vẫn file đấy sáng /system/app nhưng đổi tên luôn thành b.apk
    Mã:
    cp /sdcard/a.apk /system/app/b.apk
  • Move: ví dụ từ /sdcard/a.apk ra /sdcard/external_sd/
    Mã:
    mv /sdcard/a.apk /sdcard/external_sd/
    Nếu muốn move đổi tên luôn
    Mã:
    mv /sdcard/a.apk /sdcard/external_sd/b.apk
  • Rename: ví dụ /system/app/a.apk sang /system/app/b.apk
    Mã:
    mv /system/app/a.apk /system/app/b.apk
  • Xoá: ví dụ xoá /system/app/a.apk
    Mã:
    rm /system/app/a.apk
    Xóa tất cả các thứ trong thư mục system ko cần biết có gì bên trong:
    Mã:
    rm -r /system/
  • Tạo thư mục: ví dụ tạo thư mục catlog trong /data/
    Mã:
    mkdir data/catlog
  • Gỡ bỏ một chương trình người dùng cài đặt vào: đơn giản chỉ cần xoá file tương ứng trong /data/app. Nên kết hợp với lệnh ls để xem danh sách file
    Mã:
    rm /data/app/UserApp.apk
  • Chỉnh permission: ví dụ /system/app/SystemUI.apk sang 644 (rw-r-r)
    Mã:
    chmod 644 /system/app/SystemUI.apk
  • Thoát: từ root ra shell hoặc từ shell ra adb
    Mã:
    exit
4. Ví dụ chung:
  • Copy đè file D:\mod\LGPhone.apk từ máy tính vào điện thoại:
Mã:
adb shell
su
mount -o remount,rw /system
exit
exit
adb push D:\mod\LGPhone.apk /system/app
adb shell su chmod 644 /system/app/LGPhone.apk
  • Set quyền 644 cho tất cả các file .so trong thư mục lib
    Mã:
    adb shell
    su
    mount -o remount,rw /system
    chmod 644 system/lib/*.so
    Xoá hết apk trong system/app
    Mã:
    adb shell
    su
    mount -o remount,rw /system
    rm system/app/*.apk
    Có gì mọi người bổ sung thêm.

Tuesday, December 8, 2015

Chạy các trình tự động trong Windows nhờ các thiết lập trong Task Scheduler

Máy tính là một công cụ tự động tốt nhất và hãy để nó thay bạn tự thực hiện một số việc hàng ngày. Một trong những giải pháp là sử dụng công cụ Task Scheduler tích hợp sẵn trong Windows để tự khởi động những chương trình cần thiết.
Trong khuôn khổ bài viết này, chúng ta sẽ sử dụng các phần mềm Excel, Firefox và Skype để làm ví dụ. Một điều duy nhất cần lưu ý là bạn phải tự đăng nhập vào máy tính mỗi ngày và phần còn lại hãy để Task Scheduler đảm nhận.
Chuẩn bị
Để khởi chạy Task Scheduler trong Windows 8.1, hãy mở thanh Charms Bar bằng cách nhấn tổ hợp phím Windows Logo + C, nhập cụm từ “Schedule tasks” vào ô tìm kiếm và sau đó nhấn chọn Task Scheduler để mở ứng dụng. Trong khi đó, người dùng Windows 7 có thể truy xuất Task Scheduler bằng cách vào trình đơn Start, chọn Control Panel, vào mục Administrative Tools và chọn Task Scheduler.
Tạo danh sách chương trình tự động chạy khi khởi động
Hãy đảm bảo rằng mục Task Scheduler (Local) trong khung bên trái đang được chọn. Sau đó, trong trình đơn phía trên, chọn Action > Create Basic Task… Mục đích của chúng ta là sẽ tạo một tác vụ cho mỗi ứng dụng tự động chạy khi đã khởi động vào Windows.
Trong cửa sổ vừa mở lên, hãy làm theo các bước hướng dẫn. Trước hết, bạn phải đặt tên cho tác vụ vừa tạo và điền vào phần mô tả. Chẳng hạn, đối với Firefox sẽ đặt tên cho tác vụ này là “Morning Fox” và phần mô tả sẽ nhập vào “opens Firefox and Gmail”. Sau đó nhấn Next.
Bây giờ bạn phải định thời gian cần mở Firefox, chẳng hạn từ thứ Hai đến thứ Sáu thì bạn có thể đánh dấu chọn ô Weekly và nhấn Next.
Tiếp theo, hãy chọn thời gian thực hiện tác vụ. Giả sử bạn có thể chọn mốc thời gian 8:45:27 AM (hai số cuối để chỉ giây). Hãy nhớ đánh dấu chọn các ngày làm việc trong tuần từ Monday đến Friday rồi nhấn Next.
Trong mục “Start a program” tiếp theo, hãy chọn chương trình mà bạn muốn tự động chạy, cụ thể trong trường hợp này là Firefox. Hãy nhấn nút Browser bên cạnh ô “Program /script:” và chọn nơi có chứa tập tin thực thi firefox.exe.
Giả sử sau khi Firefox đã chạy và bạn muốn nó tự động mở một trang web cụ thể nào đó, chẳng hạn dịch vụ Gmail để kiểm tra email, chỉ cần nhập vào địa chỉ đầy đủ của trang Gmail vào ô “Add arguments (optional):” ngay bên dưới ô “Program /script:”. Trong trường hợp này, hãy gõ vào địa chỉ https://mail.google.com/.
Sau khi nhấn Next, bạn sẽ thấy một bản tóm tắt về tác vụ vừa tạo. Cuối cùng, hãy nhấn Finish để hoàn thành.
Tiếp tục tạo các tác vụ khác
Nếu muốn một chương trình khác tự chạy, bạn hãy tạo một tác vụ khác tương tự như các bước trên và lặp lại nếu có nhiều chương trình.
Hãy tạo các tác vụ có thời gian thực hiện khác nhau, tránh tạo thời gian thực hiện trùng nhau chẳng hạn cách nhau vài phút, nhằm tạo điều kiện cho Windows có thời gian để khởi động các chương trình và tránh các vấn đề phát sinh về nguồn tài nguyên của hệ thống.

Sunday, December 6, 2015

Quick Sort – Các vấn đề liên quan đến Đệ quy

Nguồn mình Coppy: www.nguyenvanquan7826.com .
Ý tưởng: QuickSort chia mảng thành hai danh sách bằng cách so sánh từng phần tử của danh sách với một phần tử được chọn được gọi là phần tử chốt. Những phần tử nhỏ hơn hoặc bằng phần tử chốt được đưa về phía trước và nằm trong danh sách con thứ nhất, các phần tử lớn hơn chốt được đưa về phía sau và thuộc danh sách con thứ hai. Cứ tiếp tục chia như vậy tới khi các danh sách con đều có độ dài bằng 1
Có các cách chọn phần tử chốt như sau:
– Chọn phần tử đứng đầu hoặc đứng cuối làm phần tử chốt.
– Chọn phần tử đứng giữa danh sách làm phần tử chốt.
– Chọn phần tử trung vị trong 3 phần tử đứng đầu, đứng giữa và đứng cuối làm phần tử chốt.
– Chọn phần tử ngẫu nhiên làm phần tử chốt (Cách này hay được chọn vì tránh được các trường hợp đặc biệt)
Hình minh họa:
Quick Sort

Cài đặt bằng C:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#include<stdlib.h>
#include<time.h>      // thu vien de khoi tao tham so cho ham rand()
#define swap(type, a, b) {type temp = a; a = b; b = temp; } // hang hoan vi
 
void quickSort(int *a, int l, int r)
{
    srand(time(NULL));  //khoi tao tham so ham rand()
    int key = a[l + rand() % (r-l+1)];  //lay khoa la gia tri ngau nhien tu a[l] -> a[r]
    //int key = a[(l+r)/2];
    int i = l, j = r;
 
    while(i <= j)
    {
        while(a[i] < key) i++;       // tim phan tu ben trai ma >=key
        while(a[j] > key) j--;       // tim phan tu ben trai ma <=key
        if(i <= j)
        {
            if (i < j)
                swap(int, a[i], a[j]);  // doi cho 2 phan tu kieu int a[i], a[j].
            i++;
            j--;
        }
    }
    //bay gio ta co 1 mang : a[l]....a[j]..a[i]...a[r]
    if (l < j) quickSort(a, l, j);   // lam lai voi mang a[l]....a[j]
    if (i < r) quickSort(a, i, r); // lam lai voi mang a[i]....a[r]
}
 
int main ()
{
    int i, arr[] = { 40, 10, 100, 90, 20, 25 };
    quickSort(arr, 0, 5);
    for (i=0; i<6; i++)
        printf ("%d ", arr[i]);
    return 0;
}
Thuật toán được cài đặt từ dòng 6 đến dòng 29. Trong đó có dòng 21 swap(int, a[i], a[j]); là một hằng dùng để hoán vị 2 số a[i] và a[j] được định nghĩa tại dòng 4 và nó tương đương với đoạn code sau (bạn có thể thay nó trực tiếp vào):
1
2
3
4
5
{
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}
Bạn cũng có thể xem đoạn code sau, với đoạn code này tôi đã in ra màn hình mọi sự biến đổi của mảng, của l, r, i, j giúp chúng ra quan sát được chính xác sự thay đổi trong từng bước:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<stdio.h>
#include<stdlib.h>
#include<time.h>      // thu vien de khoi tao tham so cho ham rand()
#define swap(type, a, b) {type temp = a; a = b; b = temp; } // hang hoan vi
 
void quickSort(int *a, int l, int r)
{
    srand(time(NULL));  //khoi tao tham so ham rand()
    int key = a[l + rand() % (r-l+1)];  //lay khoa la gia tri ngau nhien tu a[l] -> a[r]
    //int key = a[(l+r)/2];
    int i = l, j = r;
    printf("nnl = %d   r = %d    select: key = %d  (random) ",l, r, key);
 
    while(i <= j)
    {
        //printf("n");
        printf("nnti : %d", i);
        while (a[i] < key) { i++; printf(" -> %d",i); }
        printf("ntj : %d", j);
        while (a[j] > key) { j--; printf(" -> %d",j); }
        if(i <= j)
        {
            if (i < j)
            {
                swap(int, a[i], a[j]);  // doi cho 2 phan tu kieu int a[i], a[j].
                printf("ntswap(a[%d], a[%d])  swap(%d, %d)", i, j, a[i], a[j]);
            }
            i++;
            j--;
            printf("ntarr[] : ");
            for (int i=0; i<8; i++)
                printf ("%d ", a[i]);
        }
    }
    //bay gio ta co 1 mang : a[l]....a[j]..a[i]...a[r]
    if (l < j) quickSort(a, l, j);   // lam lai voi mang a[l]....a[j]
    if (i < r) quickSort(a, i, r); // lam lai voi mang a[i]....a[r]
}
 
int main ()
{
    int i, arr[] = { 2, 8, 7, 1, 3, 5, 6, 4  };
    int n = 8;
    printf("nnArray befor sort: ");
    for (i=0; i<n; i++)
        printf ("%d ", arr[i]);
 
    quickSort(arr, 0, n-1);
 
    printf("nnArray after sort: ");
    for (i=0; i<n; i++)
        printf ("%d ", arr[i]);
}
Ta nhận thấy hiệu quả của thuật toán phụ thuộc vào việc chọn giá trị mốc (hay phần tử chốt).
– Trường hợp tốt nhất: mỗi lần phân hoạch ta đều chọn được phần tử median (phần tử lớn hơn hay bằng nửa số phần tử và nhỏ hơn hay bằng nửa số phần tử còn lại) làm mốc. Khi đó dãy được phân hoạch thành hai phần bằng nhau, và ta cần log2(n) lần phân hoạch thì sắp xếp xong. Ta cũng dễ nhận thấy trong mỗi lần phân hoạch ta cần duyệt qua n phần tử. Vậy độ phức tạp trong trường hợp tốt nhất thuộc O(nlog2(n)).
– Trường hợp xấu nhất: mỗi lần phần hoạch ta chọn phải phần tử có giá trị cực đại hoặc cực tiểu làm mốc. Khi đó dãy bị phân hoạch thành hai phần không đều: một phần chỉ có một phần tử, phần còn lại có n-1 phần tử. Do đó, ta cần tới n lần phân hoạch mới sắp xếp xong. Vậy độ phức tạp trong trường hợp xấu nhất thuộc O(n2).

* Vậy ta có độ phức tạp của Quick Sort như sau:

– Trường hợp tốt nhất: O(nlog2n)
– Trường hợp xấu nhất: O(n2)
– Trường hợp trung bình: O(nlog2n)

Khử đệ quy trong Quic Sort

Bản chất của các giải thuật đệ quy là lưu trữ các tham biến đệ quy vào một ngăn xếp (stack) để lần lượt lấy ra xử lý. Như vậy nếu gặp dữ liệu lớn sẽ dễ gây tràn stack. Khi khử đệ quy của giải thuật đệ quy, với mỗi lần cần gọi hàm quicksort trong đệ quy ta thay bằng cách lưu lại các giá trị bên trái và bên phải của 2 dãy con vào 2 stack Sl và Sr, khi nào cần sẽ gọi ra. Ngoài ra chúng ta cũng có thể lưu chung các giá trị bên trái và bên phải vào 1 Stack, khi lấy ra sẽ lấy 2 phần tử liên tiếp.
b1: Khởi tạo 2 Stack rỗng Sl, Sr để lưu các giá trị l và các giá trị r của mỗi mảng con.
b2: Ban đầu dãy đang xét từ 0 đến n-1, ta lưu l vào Sl và r vào Sr
b3: Lấy l ra từ Sl, r ra từ Sr
b4: Phân hoạch dãy A[L] .. A[R] thành 2 dãy A[l]..A[j] và A[i]..A[r]
b5: Nếu l < j lưu l và j vào Sl và Sr, Nếu i < r lưu i và r vào Sl và Sr,
b6: Nếu Stack không rỗng quay lại b3.
Sau đây là code cài đặt, trong code có dùng đến stack trong C++, nếu bạn không muốn hoặc chưa quen dùng stack trong C++ có thể tham khảo cách xây dựng 1 Stack tại đây.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<stdlib.h>
#include<time.h>      // thu vien de khoi tao tham so cho ham rand()
#include<stack>       // Su dung Stack trong C++
#define swap(type, a, b) {type temp = a; a = b; b = temp; }
 
using namespace std;
 
void quickSortUnRecursive(int *a, int l, int r)
{
    srand(time(NULL));
    stack Sl;       // Stack left
    stack Sr;       // Stack right
    Sl.push(l);         // dua phan tu dau tien l vao Sl
    Sr.push(r);         // dua phan tu dau tien r vao Sl
 
    while(!Sl.empty())  // trong khi stack khong rong
    {
 
        int l = Sl.top(); Sl.pop();     // lay phan tu dau tien trong Sl l ra
        int r = Sr.top(); Sr.pop();     // lay phan tu dau tien trong Sr r ra
        int key = a[l + rand() % (r-l+1)];
        int i = l, j = r;
        while (i <= j)       // phan hoach thanh 2 day con
        {
            while (a[i] < key) i++;
            while (a[j] > key) j--;
 
            if(i <= j)
            {
                if (i < j)
                    swap(int, a[i], a[j]);
                i++;
                j--;
            }
        }
        if (l < j) { Sl.push(l); Sr.push(j); }   // dua 2 dau mut l va j vao Sl va Sr
        if (i < r) { Sl.push(i); Sr.push(r); }   // dua 2 dau mut i va r vao Sl va Sr
    }
}
 
int main ()
{
    int i, arr[] = { 40, 10, 100, 90, 20, 25 };
    quickSortUnRecursive(arr, 0, 5);
    for (i=0; i<6; i++)
        printf ("%d ", arr[i]);
    return 0;
}

Sử dụng đệ quy đuôi trong Quick Sort

Ta cũng có thể sử dụng thuật toán đệ quy đuôi để xây dựng thuật toán Quick Sort, tức là chỉ dùng một lời gọi đệ quy trong hàm, tuy nhiên để thực hiện việc này chúng ta sẽ phải chọn phần tử chốt là phần tử đầu tiên hoặc cuối cùng của mảng cần sắp xếp. Ta Có thể phân tích trường hợp này như sau:
Trước tiên ta xác định việc phân dãy ra làm 2 mảng con như sau:
01
02
03
04
05
06
07
08
09
10
11
12
13
int partition(int *a, int l, int r)
{
    int key = a[r];     // xac dinh khoa
    int i = l - 1, j;   // khoi tao i, j
    for (j=l; j<r; j++)  // duyet mang
        if (a[j] <= key) //neu a[j] <= key
        {
            i++;
            swap(int, a[i], a[j]);  // hoan vi
        }
    swap(int, a[i+1], a[r]);    // hoan vi voi phan tu khoa
    return i + 1;   // tra ve vi tri cua khoa
}
quick sort Tail Recursive
Sau khi phân chia dãy ta được 2 dãy, dãy bên trái là những phần tử nhỏ hơn hoặc bằng key, bên phải là dãy các phần tử lớn hơn key.
Bây giờ ta xây dựng Quick Sort đệ quy đuôi như sau:
1
2
3
4
5
6
7
8
9
void TailRecursiveQuicksort(int *a, int l, int r)
{
    while (l<r)
    {
        int q = partition(a,l,r);   //lay vi tri khoa
        TailRecursiveQuicksort(a, l, q-1);      // sap xep day ben trai
        l = q + 1;      // khi day ben trai sap xep xong ta chuyen sang day ben phai
    }
}
Ngoài ra, nhằm mục đích sao cho khi gọi đệ quy, Stack của chúng ta có thể phải chứa càng ít càng tốt, vì vậy ta cải tiến một chút giải thuật như sau:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
void TailRecursiveQuicksort_2(int *a, int l, int r)
{
    while (l<r)
    {
        int q = partition(a,l,r);
        if (q < (l + (r-l)/2))   //Neu vi tri khoa < 1/2 do dai day thi sap xep ben phai
        {
            TailRecursiveQuicksort_2(a, l, q-1);
            l = q + 1;
        }
        else    //Neu vi tri khoa >= 1/2 do dai day thi sap xep ben trai
        {
            TailRecursiveQuicksort_2(a, q + 1, r);
            r = q-1;
        }
    }
}

Sử dụng Quick Sort xây dựng sẵn trong C++

Trong thư viện của C++ đã xây dựng sẵn cho chúng ta hàm qsort và chúng ta có thể sử dụng ngay nó.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
 
int arr[] = { 40, 10, 100, 90, 20, 25 };
 
int compare (const void * a, const void * b)
{
  return ( *(int*)a > *(int*)b );
}
 
int main ()
{
      int n;
      qsort (arr + 1, 4, sizeof(int), compare);
      for (n=0; n<6; n++)
         printf ("%d ",arr[n]);
      return 0;
}
Trong lời gọi hàm qsort: qsort (arr + 1, 4, sizeof(int), compare);
arr + 1 chính là vị trí mảng bắt đầu sắp xếp, ở đây tương đương với sắp xếp từ phần tử a[1] = 10 và sắp xếp 4 phần tử tức là từ a[1] đến a[4].
sizeof(int) là kích thước 1 phần tử trong mảng. Nếu mảng là kiểu thực ta sẽ có là sizeof(float).
compare được xây dựng với cấu trúc như sau dùng để xác định mảng được sắp xếp tăng hay giảm
1
2
3
4
int compareMyType (const void * a, const void * b)
{
    return ( *(MyType*)a @ *(MyType*)b );
}
Trong đó MyType là kiểu của các phần tử mảng. “@” là một phép toán nào đó được định nghĩa. Trong thư viện đã định nghĩa sẵn cho chúng ta 3 phép toán >, ==, <. Trong ví dụ này ta dùng *(int*)a > *(int*)b để sắp xếp tăng, ngược lại nếu *(int*)b > *(int*)a sẽ sắp xếp giảm.

Sắp xếp mảng cấu trúc bằng Quick Sort có sẵn trong C++

Tiếp theo chúng ta sẽ làm thế nào nếu chúng ta có 1 mảng các phẩn tử cấu trúc Struct và muốn sắp xếp theo 1 trường nào đó.
Ta sẽ định nghĩa 1 phép toán “@” để so sánh 1 trường nào đó bằng hàm bool operator sau đó xây dựng lại hàm int compare thep phép toán đã được xây dựng:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include<cstdlib>
using namespace std;
 
struct St
{
    string name;
    int scores;
};
 
bool operator * ( const St &t, const St &u )    // dinh nghia phep toan "*"
{
    return t.name > u.name;  //sap xep tang dan theo ten
}
 
bool operator/( const St &t, const St &u )  // dinh nghia phep toan "/"
{
    return t.scores < u.scores;  //sap xep giam dan theo diem
}
 
int compare_name (const void * a, const void * b)
{
    return ( *( St*)a * *(St*)b );  //chi duoc su dung phep toan "*" de sap xep
}
 
int compare_scores (const void * a, const void * b)
{
    return ( *( St*)a / *(St*)b );  //chi duoc su dung phep toan "/" de sap xep
}
 
int main ()
{
    St arr[] = { {"Hien", 9}, {"Cuong", 7}, {"Nhung", 8}, {"Nam", 6} };
 
    int n = sizeof( arr ) / sizeof( St );
    qsort (arr, n, sizeof(St), compare_name);
 
    cout << "nDanh sach xap xep tang dan theo ten:n";
    for (int i = 0; i < n; i++ )
        cout << arr[ i ].name << ' ' << arr[ i ].scores << endl;
 
    qsort (arr, n, sizeof(St), compare_scores);
    cout << "nDanh sach xap xep giam dan theo diem:n";
    for (int i = 0; i < n; i++ )
        cout << arr[ i ].name << ' ' << arr[ i ].scores << endl;
 
    return 0;
}
Trong đoạn code trên tôi đã dùng các ký hiệu đặc biệt * và / (mà chính xác hơn là các ký hiệu bình thừong được dùng làm phép toán nhân và chia) để định nghĩa phép toán cho cách sắp xếp. Chúng ta có thể dùng một số ký tự phép toán khác như %, ^, *, /, +, -, >, =, < để định nghĩa phép toán mới.