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 )
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();