SLIDE1

Sunday, April 5, 2015

thuật toán shell sort - cải tiến của chèn trực tiếp

thuật toán shell sort - cải tiến của chèn trực tiếp




shell sort là Cải tiến của phương pháp chèn trực tiếp
Ý tưởng:
Phân hoạch dãy thành các dãy con
Sắp xếp các dãy con theo phương pháp chèn trực tiếp
Dùng phương pháp chèn trực tiếp sắp xếp lại cả dãy.
Phân chia dãy ban đầu thành những dãy con gồm các phần tử  ở cách nhau h vị trí
Dãy ban đầu : a1, a2, ..., an được xem như sự xen kẽ của các dãy con sau :
Dãy con thứ nhất : a1 ah+1 a2h+1 ...
Dãy con thứ  hai  : a2 ah+2 a2h+2 ...
....

Dãy con thứ  h     : ah a2h a3h ...
Tiến hành sắp xếp các phần tử trong cùng dãy con sẽ làm cho các phần tử  được đưa về vị trí đúng tương đối
Giảm khoảng cách h để tạo thành các dãy con mới
Dừng khi h=1
Giả sử quyết định sắp xếp k bước, các khoảng cách  chọn phải thỏa điều kiện :
hi  > hi+1  và hk = 1
 hi  = (hi-1  - 1)/3 và hk = 1, k = log3n-1
Ví dụ :127, 40, 13, 4, 1
 hi  = (hi-1 - 1)/2 và hk = 1, k = log2n-1
Ví dụ : 15, 7, 3, 1
h có dạng 3i+1: 364, 121, 40, 13, 4, 1
Dãy fibonaci: 34, 21, 13, 8, 5, 3, 2, 1
h là dãy các số nguyên tố giảm dần đến 1: 13, 11, 7, 5, 3, 1.
Bước 1: Chọn k khoảng cách h[1], h[2], ..., h[k];
i = 1;
Bước 2: Phân chia dãy ban đầu thành các dãy con   cách nhau h[i] khoảng cách.
Sắp xếp từng dãy con bằng phương pháp   chèn trực tiếp;
Bước 3 : i = i+1;            Nếu  i > k : Dừng            Ngược lại : Lặp lại Bước 2.    
Cho dãy số a:
12   2 8 5 1 6 4 15

Giả sử chọn các khoảng cách là 5, 3, 1

void ShellSort(int a[],int n, int h[], int k)
{ int step,i,j, x,len;
for (step = 0 ; step <k; step++)
{ len = h[step];
for (i = len; i<n; i++)
{
x = a[i]; 
j = i-len; // a[j] đứng kề trước a[i] trong cùng dãy con 
while ((x<a[j])&&(j>=0)// sắp xếp dãy con chứa  x 
{ // bằng phương pháp chèn trực tiếp 
a[j+len]  = a[j];
j = j - len;
}
a[j+len] = x;
}
}
}

Related Posts:

  • thuật toán shell sort - cải tiến của chèn trực tiếp thuật toán shell sort - cải tiến của chèn trực tiếp shell sort là Cải tiến của phương pháp chèn trực tiếp Ý tưởng: Phân hoạch dãy thành các dãy con Sắp xếp các dãy con theo phương pháp chèn trực tiếp Dùng phương pháp… Read More
  • thuật toán heap sort - sắp xếp vun đống, (cây) thuật toán heap sort - sắp xếp vun đống, (cây) Heap Sort tận dụng được các phép so sánh ở bước i-1 mà thuật toán sắp xếp chọn trực tiếp không tận dụng được Để làm được điều này Heap sort thao tác dựa trên cây. Ở cây trê… Read More
  • thuật toán sắp xếp radix sort Radix Sort là một thuật toán tiếp cận theo một hướng hoàn toàn khác. Nếu như trong các thuật toán khác, cơ sở để sắp xếp luôn là việc so sánh giá trị của 2 phần tử thì Radix Sort lại dựa trên nguyên tắc phân loại thư của b… Read More
  • thuật toán merge sort - sắp xếp trộn Giải thuật Merge sort sắp xếp dãy a1, a2, ..., an dựa trên nhận xét sau: Mỗi dãy a1, a2, ..., an bất kỳ là một tập hợp các dãy con liên tiếp mà mỗi dãy con đều đã có thứ tự. Ví dụ: dãy 12, 2, 8, 5, 1, 6, 4, 15 có thể coi… Read More
  • thuật toán quick sort - sắp xếp nhanh Giải thuật QuickSort sắp xếp dãy a1, a2 ..., aN dựa trên việc phân hoạch dãy ban đầu thành 3 phần : Phần 1: Gồm các phần tử  có giá trị bé hơn x Phần 2: Gồm các phần tử  có giá trị bằng  x Phần 3: Gồm các phần… Read More