Các Thuật Toán Sắp Xếp Cơ Bản - Qick Sort

Qick Sort chia làm 2 phần: 
PHẦN 1: Phân hoạch dãy ban đầu thành 3 dãy:
B1:
- Chọn 1 phần tử ngẫu nhiên x; thông thường ta lấy x là phần tử giữa (x=a[(l+r)/2] );
- Gán i = l, j = r
B2: Hoán đỗi những phần tử sai vị trí:
2.1 Nếu a<x thì i++
2.2 Nếu a[j]>x thì j--
2.3 Nếu i<=j thì hoán vị a,a[j] và tăng i, j lên ( i++; j--)
B3:
3.1 Nếu i>=j dừng dãy đã được sắp xếp
3.2 Nếu i<j tới B2
PHẦN 2: Thuật Toán
B1: Phân hoạch dãy đã cho thành 3 dãy: ( dùng thuật toán bên trên )
- Dãy 1: các phần tử nhỏ hơn x
- Dãy 2: x
- Dãy 3: Các phần tử lớn hơn x
B2: Gọi đệ qui
2.1 Nếu (l<j) phân hoạch dãy 1 ( l->j)
2.1 Nếu (i<r) phân hoạch dãy 3 (i->r)
Code tham khảo thuật toán ( chương trinh chạy bằng phần mềm codeblock )

#include<conio.h>
#include<stdio.h>
void qicksort(int a[],int l,int r)
{
    int i,j,t,x;
    x=a[(l+r)/2];
    i=l; j=r;
    do
    {
        while(a[i]<x) i++;
        while(a[j]>x) j--;
        if (i<=j) {t=a[i];a[i]=a[j];a[j]=t; i++;j--;}
 
    }while(i<j);
    if(l<j)
    qicksort(a,l,j);
    if(i<r)
    qicksort(a,i,r);
}
void main()
{
    int a[10];
    int n,i,j;
    for (i=1;i<7;i++)
    {
        printf("a[%d]= ",i);
        scanf("%d",&a[i]);
    }
    qicksort(a,1,6);
    for(i=1;i<7;i++)
    printf("%3d",a[i]);
    getch();