# data[].attributes.body
+ Đỗ Tấn Từ: Tìm hiểu và phân tích  sơ lược về Quick Sort
+ Hồ Lê Minh Hoàng: Mô tả cách hoạt động của thuật toán
+ Trần Đăng Hào: Minh họa rõ hơn về cách duyệt mảng và sắp xếp
+ Nguyễn Việt Long: Cài đặt thuật toán và in ra màn hình kết quả

# data[].attributes.body
1.   Trần Đăng Hào
2.   Đỗ Tấn Từ
3.   Hồ Lê Minh Hoàng
4.    Nguyễn Việt Long
-->> Nhóm trưởng: Đỗ Tấn Từ

# data[].attributes.body
Quick Sort là một thuật toán sắp xếp tại chỗ trong khi Merge Sort phải sử dụng thêm không gian. Sắp xếp tại chỗ có nghĩa là không có dung lượng lưu trữ bổ sung nào được sử dụng để thực hiện sắp xếp (ngoại trừ ngăn xếp đệ quy). Merge Sort yêu cầu một mảng tạm thời để hợp nhất các mảng đã sắp xếp, vì vậy Quick Sort trở thành tùy chọn tốt hơn.

# data[].attributes.headline
Cảm ơn cô đã xem bài tập 1 của nhóm 8. Mong cô để lại các ý kiến, để nhóm em có thể bổ sung và hoàn thiện phần làm bài của nhóm mình 

# data[].attributes.subject
Cảm ơn cô đã xem bài tập 1 của nhóm 8. Mong cô để lại các ý kiến, để nhóm em có thể bổ sung và hoàn thiện phần làm bài của nhóm mình 

# data[].attributes.body
#include<stdio.h>

void nhap(int a[], int n){

int i;

for(i=1; i<=n; i++){

printf("Nhap a[%d]: ",i);

scanf("%d", &a[i]);

}

}

void hoanvi(int &a, int &b)

{

int tg;

tg = a;

a = b;

b = tg;

}

int Khoa(int a[], int left, int right)

{

int khoa = a[right];

int l = left;

int r = right - 1;

while(true){

while(l <= r && a[l] < khoa)

l++;

while(r >= l && a[r] >= khoa)

r--;

if (l >= r) break;

hoanvi(a[l], a[r]);

l++;

r--;

}

hoanvi(a[right], a[l]);

return l;

}

void sapxep(int a[], int left, int right)

{

if (left < right)

{

int p =   Khoa(a, left, right);

sapxep(a, left, p - 1);

sapxep(a, p + 1, right);

}

}

void xuat(int a[], int n)

{

int i;

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

printf("%d ", a[i]);

printf("\n");

}

main()

{

int a[100];

int n;

printf("Nhap so luong phan tu mang: ");

scanf("%d", &n);

nhap(a, n);

sapxep(a, 1, n);

printf("Day so sau khi sap xep la : ");

xuat(a, n);

return 0;

}

# data[].attributes.body
Dãy số ban đầu:
10           5            7              3             1              4

Quá trình sắp xếp:

i = -1;  j = 0;  pivot = 4

10           5             7             3             1             4

i = -1;  j = 1;  pivot = 4

10           5             7             3             1             4

i = -1;  j = 2;  pivot = 4

10           5             7             3             1             4

i = 0;  j = 3;  pivot = 4

3             5             7             10           1             4

i = 1;  j = 4;  pivot = 4

3             1             7             10           5             4

i = 1;  j = 5;  pivot = 4

3             1             7             10           5             4

// hết vòng lặp

// hoán vị (Hoán vị trị pivot cho vị trí I + 1):

3             1             4             10           5             7
// Mảng bên Trái:

3             1

i = -1;  j = 0;  pivot = 1

3             1

// hết vòng lặp
// hoán vị (Hoán vị trị pivot cho vị trí I + 1):

1             3

// Mảng bên phải:

4             10           5             7

i = 0;  j = 0;  pivot = 7

4             10           5             7

i = 0;  j = 1;  pivot = 7

4             10           5             7

i = 1;  j = 2;  pivot = 7

4             5             10           7

i = 1;  j = 3;  pivot = 7

4             5             10           7

// hết vòng lặp
// hoán vị (Hoán vị trị pivot cho vị trí I + 1):

4             5             7             10

Kết quả :

1             3             4             5             7             10

# data[].attributes.headline
CÙNG NHAU PHÂN TÍCH VỀ SẮP XẾP NHANH(Quick Sort)

# data[].attributes.subject
CÙNG NHAU PHÂN TÍCH VỀ SẮP XẾP NHANH(Quick Sort)

# data[].attributes.body
Thuật toán sẽ có hai quá trình. Giai đoạn đầu là phân đoạn mảng ( partition ( ) ) và tiến trình sau là sắp xếp ( quickSort ( ) ) .

Chọn pivot cho mảng.

Tạo hai biến là left và right để trỏ đến bên trái và bên phải của danh sách.

Tiến hành so sánh các phần tử với pivot. Trong trường hợp phần tử nhỏ hơn pivot thì dịch chuyển qua bên trái và ngược lại.

Sau khi đã dịch chuyển thì tiến hành công việc sắp xếp các phần tử trong mảng con mới, trước khi tiếp tục phân đoạn tiếp theo.

# data[].attributes.headline
Giới thiệu về thuật toán sắp xếp nhanh-Quick Sort (Đỗ Tấn Từ: 2050531200324 )

# data[].attributes.subject
Giới thiệu về thuật toán sắp xếp nhanh-Quick Sort (Đỗ Tấn Từ: 2050531200324 )

# data[].attributes.body
Thuật toán sắp xếp nhanh hay còn gọi là QuickSort Algorithm là một trong 6 thuật toán sắp xếp thông dụng nhất của khoa học máy tính. Thuật toán sử dụng tư tưởng chia để trị nên còn được ví là part sort và thuộc loại sắp xếp phức tạp. Từ dãy ban đầu, người ta sẽ chia dãy thành hai phần nhỏ theo một quy tắc xác định, từ đó giúp cải thiện tốc độ của việc săp xếp.

Có 3 cách chọn pivot (phần tử làm chốt), mục đích là để chọn được phần tử có giá trị trung gian để chia làm hai vế cho danh sách.

1. Chọn phần tử đầu mảng hoặc phần tử cuối làm chốt

2. Chọn phần tử ở giữa mảng

3. Chọn phần tử trung vị trong ba phần tử đứng đầu, đứng giữa và đứng cuối làm phần tử chốt.

4. Chọn phần tử ngẫu nhiên làm phần tử chốt. Tuy nhiên cách này rất dễ dẫn đến khả năng rơi vào các trường hợp đặc biệt.

Trong bài này nhóm em lựa chọn pivot ở cuối mảng để sắp xếp