PH N A: N N T NG LÝ THUY T
1. Mô t ch c năng và yêu c u
1.1.Khái quát v s p x p: ế
Đ thu n ti n gi m thi u th i gian thao tác đ c bi t đ tìm
ki m d li u d dàng nhanh chóng,thong th ng tr c khi thao tác thìế ườ ướ
d li u trên m ng,trên t p tin đã có th t .Do v y thao tác s p x p d li u ế
m t trong nh ng thao tác c n thi t th ng g p trong quá trình l u ế ườ ư
tr ,qu n lý d li u
r t nhi u cách s p x p d li u,nh ng đây ta ch quan tâm đ n 2 ế ư ế
thu t toán s p x p b ng ph ng pháp chèn (Insertion Sort) s p x p ế ươ ế
d a trên s phân ho ch (Quick Sort).Ta s đi phân tích hai thu t toán s p
x p này đ so sánh và đánh giá đ ph c t p c a chúng.ế
1.2.M c tiêu c a bài toán:
Phân tích,đánh giá và so sánh đ ph c t p(trên lý thuy t) và so sánh th i ế
gian tính toán(trên th c nghi m) c a 2 gi i thu t.
2. Đánh giá đ ph c t p c a gi i thu t s p x p b ng ph ng pháp ế ươ
chèn(Insertion Sort)
2.1.Ý t ng thu t toán:ưở
Gi s ta có dãy a 1, a2, …, an trong đó i ph n t đ u tiên a 1, a2, …, ai đã có
th t . Ý t ng c a thu t toán là tìm v tr thích h p và chèn ph n t a ưở i+1
vào dãy đã có th t trên đ có đ c m t dãy m i có th t . C th , làm ượ ế
đ n cu i dãy ta s đ c m t dãy có th t .ế ượ
V i dãy ban đ u a 1, a2, …, an ta có th coi đo n ch có m t ph n t a 1
m t đo n đã có th t , sau đó ta chèn ph n t a 2 vào dãy a1 đ dãy a1a2
có th t . Ti p đó, ta l i chèn ph n t a ế 3 vào dãy a1a2 đ có dãy a1a2a3
th t . C th , đ n cu i cùng ta chèn ph n t a ế ế n vào dãy a1a2…an-1 ta s
đ c dãy aượ 1a2…an có th t .
Insertion Sort và Quick Sort Trang 1
2.2.Cài đ t thu t toán
void insertionsort(int a[],int n)
{
int pos,x;
for(int i=0;i<n-1;i++)
{
x=a[i+1];pos=i;
while(pos>=0 && a[pos]>x)
{
a[pos+1]=a[pos];
pos--;
}
a[pos+1]=x;
}
}
2.3.Đánh giá đ ph c t p:
Ta th y các phép so sánh x y ra trong vòng l p nh m tìm v trí thích h p
pos đ chèn x. M i l n so sánh th y v trí đang xét không thích h p, ta d i
ph n t a[pos] sang ph i.
Ta cũng th y s phép gán s phép so sánh c a thu t toán ph thu c vào
tình tr ng c a dãy ban đ u. Do đó ta ch có th c l ng nh sau: ướ ượ ư
2.3.1. Tr ng h p t t nh t: ườ Dãy ban đ u đã th t . Ta tìm đ c ượ
ngay v trí thích h p đ chèn ngay l n so sánh đ u tiên không
c n ph i vô vòng l p. Nh v y, v i i ch y t 2 đ n n thì s phép so ư ế
sánh t ng c ng s n-1. Còn v i s phép gán, do thu t toán không
ch y vào vòng l p nên xét i b t kỳ, ta luôn ch ph i t n 2 phép gán(x
= a[i] a[pos] = x). T đây, ta tính đ c s phép gán t ng c ng ượ
b ng 2(n - 1).
Insertion Sort và Quick Sort Trang 2
2.3.2. Tr ng h p x u nh t:ườ Dãy ban đ u th t ng c. Ta th y ượ
ngay v trí thích h p pos luôn v trí đ u tiên c a dãy đã th t ,
do đó, đ tìm ra v trí này ta ph i duy t h t dãy đã có th t . Xét ế
i b t kỳ, ta có s phép so sánh là i-1, s phép gán là (i - 1) + 2 = i + 1.
V i i ch y t 2 đ n n, ta tính đ c s phép so sánh t ng c ng b ng ế ượ
1 + 2 + … + (n - 1) = n(n - 1)/2 và s phép gán b ng 3 + 4 + .. + (n +
1) = (n + 4)(n - 1)/2
T ng k t l i, ta có đ ph c t p c a Insertion Sort nh sau: ế ư
Tr ng h p t t nh t: O(n)ườ
Tr ng h p x u nh t O(nườ 2)
3. Đánh giá đ ph c t p c a gi i thu t s p x p nhanh(Quick Sort) ế
3.1. Ý t ng thu t toán:ưở
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 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 ơ ượ ư ướ
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 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.
3.2.Cài đ t thu t toán:
void quicksort(int a[],int left,int right)
{
if(left>=right)return;
int x=a[(left+right)/2];
int i=left;
int j=right;
do
{
while(a[i]<x)i++;
while(a[j]>x)j--;
if(i<=j)//chua duyet het
Insertion Sort và Quick Sort Trang 3
{
swap(a[i],a[j]);
i++;
j--;
}
}while(i<j);
quicksort(a,left,j);
quicksort(a,i,right);
}
3.3.Đ ph c t p c a thu t toán
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).
3.3.1. 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 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, ta c n log 2(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(nlog 2(n)).
3.3.2. Tr ng h p x u nh t:ườ m i l n ph n ho ch ta ch n ph i ph n
t 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 m t ph n t ,
ph n còn l i 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).
T ng k t l i, ta có đ ph c t p c a Quick Sort nh sau: ế ư
Tr ng h p t t nh t: O(nlogườ 2(n))
Tr ng h p x u nh t: O(nườ 2)
Tr ng h p trung bình: O(nlogườ 2(n))
Insertion Sort và Quick Sort Trang 4
PH N B : TH C NGHI M
1. Mô t gi i thu t :
Gi i thu t đ c cài đ t trên ngôn ng l p trình c/c++. Ý t ng c a vi c ượ ưở
cài
đ t gi i thu t nh sau: ư
Kh i t o ng u nhiên n ph n t , ghi ra 1 file text
Đ c các ph n t t file text vào file excel
Tính đ ph c t p d a vào α
2. Cài đ t
2.1.InsertionSort:
void insertionsort(int A1[],int num,int &sosanhI,int &hoanviI)
{
int X=0,k=1,j=0;
while(k<num)
{
j=k+1;
X=A1[j];
while(X<A1[j-1])
{
Insertion Sort và Quick Sort Trang 5