Quá trình quickSort là phân vùng (). Mục tiêu của phân vùng là đưa ra một mảng và một phần tử của mảng
làm trục, đặt x ở vị trí chính xác và đặt tất cả các phần tử nhỏ hơn x vào trước x,
đặt tất cả các phần tử lớn hơn x vào sau x. Tất cả quy trình được thực hiện lặp đi lặp lại.
/* C thực hiện QuickSort */
#include<stdio.h>
// Hàm để hoán đổi 2 phần tử
void
swap(
int
* a,
int
* b)
{
int
t = *a;
*a = *b;
*b = t;
}
/*
Hàm này nhận phần tử cuối cùng làm pivot,
đặt phần tử pivot vào đúng vị trí của nó trong mảng đã sắp xếp
và đặt tất cả các phần tử nhỏ hơn (nhỏ hơn pivot) ở bên trái của pivot
và tất cả các phần tử lớn hơn ở bên phải của pivot */
int
partition (
int
arr[],
int
low,
int
high)
{
int
pivot = arr[high];
// pivot
int
i = (low - 1);
// chỉ số của phân tử nhỏ hơn
for
(
int
j = low; j <= high- 1; j++)
{
// Nếu phân tử hiện tại nhỏ hơn pivot
if
(arr[j] < pivot)
{
i++;
// tăng chỉ số của phân tử nhỏ hơn
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return
(i + 1);
}
/* Thực hiện quickSort
arr[] --> mang can sap xep,
low --> chỉ số bắt đầu,
high --> chỉ số kết thúc */
void
quickSort(
int
arr[],
int
low,
int
high)
{
if
(low < high)
{
/* pi là chỉ số đang phân vùng, arr[p] bây giờ ở đúng vị trí */
int
pi = partition(arr, low, high);
// Sắp xếp riêng biệt các phần tử trước
// phân vùng và sau phân vùng
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
/* Hiện thị mảng */
void
printArray(
int
arr[],
int
size)
{
int
i;
for
(i=0; i < size; i++)
printf
(
"%d "
, arr[i]);
printf
(
"\n"
);
}
int
main()
{
int n;
printf("Enter n: ");scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++){
printf("a[%d] = ",i+1);scanf("%d",&arr[i]);
}
quickSort(arr, 0, n-1);
printf
(
"Sorted array: \n"
);
printArray(arr, n);
return
0;
}