Các Phƣơng pháp chèn trực tiếp InterchangeSort a Ý tƣởng

Một phần của tài liệu Giáo trình Nhập môn cấu trúc dữ liệu và giải thuật (Nghề: Thiết kế đồ hoạ - CĐ/TC) - Trường Cao đẳng nghề Đồng Tháp (Trang 38 - 40)

a. Ý tƣởng

Nhận xét :

Mọi dãy a[0] , a[1] ,..., a[n-1]luơn cĩ i-1 phần tử đầu tiên a[0] , a[1] ,..., a[i-2]đã cĩ thứ tự (2 ≤ i).

Ý tưởng chính:

Tìm cách chèn phần tử aivào vị trí thích hợp của đoạn đã đƣợc sắp để cĩ dãy mới a[0] , a[1] ,... ,a[i-1]trở nên cĩ thứ tự.

Vị trí này chính là pos thỏa :a[pos-1]a[i ]< a[pos](1posi).

Chi tiết hơn:

Dãy ban đầua[0] , a[1] ,..., a[n-1], xem như đã cĩ đoạn gồm một phần tử a[0]đã được sắp.

Thêma[1] vào đoạna[0]sẽ cĩ đoạn a[0] a[1]được sắp

Thêma[2] vào đoạna[0] a[1] để cĩ đoạn a[0] a[1] a[2]được sắp

Tiếp tục cho đến khi thêm xong a[n-1] vào đoạna[0] a[1] ...a[n-1]sẽ cĩ dãy a[0] a[1]….....A[n-1]được sắp.

b. Thuật tốn

//input: dãy (a, n)

//output: dãy (a, n) đã được sắp xếp

Bƣớc 1: i = 2; // giả sử cĩ đoạna[0]đã được sắp

Bƣớc 2: x = a[i]; Tìm vị trí pos thích hợp trong đoạn a[0] đến a[i] để chèn x vào

Bƣớc 3: Dời chỗ các phần tử từ a[pos] đến a[i-1] sang phải 1 vị trí để dành chổ cho x

Bƣớc 4: a[pos] = x;// cĩ đoạna[0]..a[i] đã được sắp

Bƣớc 5: i = i+1;

Nếu in : Lặp lại Bƣớc 2. Ngƣợc lại : Dừng.

Ví dụ minh họa A[]: 12 2 8 5 1 6 4 15 i=2; x=2 1 2 3 4 5 6 7 8 2 12 8 5 1 6 4 15 i=3; x=8 1 2 3 4 5 6 7 8 2 8 12 5 1 6 4 15 i=4; x=5 1 2 3 4 5 6 7 8 2 5 8 12 1 6 4 15 i=5; x=1 1 2 3 4 5 6 7 8 1 2 5 8 12 6 4 15 i=6; x=6 1 2 3 4 5 6 7 8 1 2 5 6 8 12 4 15 i=7; x=4 1 2 3 4 5 6 7 8 1 2 4 5 6 8 12 15 i=8; x=15 1 2 3 4 5 6 7 8 1 2 4 5 6 8 12 15 c. Cài đặt thuật tốn:

void InsertionSort(int a[], int n ) { int pos, x;

for(int i=0 ; i<n ; i++)//đoạn a[0] đã sắp

{ x = a[i+1];pos= i; while(pos>=0 && a[pos]>x) { a[pos+1] = a[pos];

pos--;

}

a[pos]=x;

}

Nhận xét

Khi tìm vị trí thích hợp để chèn a[i] vào đoạn a[0] đến a[i-1], do đoạn đã đƣợc sắp cĩ thể sử dụng giải thuật tìm nhị phân để thực hiện việc tìm vị trí posgiải thuật sắp xếp chèn nhị phânBinary Insertion Sort

Lưu ý:Chèn nhị phân chỉ làm giảm số lần so sánh, khơng làm giảm số lần dời chỗ. Ngồi ra, cĩ thể cải tiến giải thuật chèn trực tiếp với phần tử cầm canh để giảm điều kiện kiểm tra khi xác định vị trí pos.

d. Đánh giá giải thuật

Các phép so sánh xảy ra trong mỗi vịng lặp tìm vị trí thích hợp pos. Mỗi lần xác định vị trí pos đang xét khơng thích hợpdời chỗ phần tử a[pos-1] đến vị trí pos.

Giải thuật thực hiện tất cả N-1 vịng lặp tìm pos, do số lƣợng phép so sánh và dời chỗ này phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ cĩ thể ƣớc lƣợc trong từng trƣờng hợp nhƣ sau:

Một phần của tài liệu Giáo trình Nhập môn cấu trúc dữ liệu và giải thuật (Nghề: Thiết kế đồ hoạ - CĐ/TC) - Trường Cao đẳng nghề Đồng Tháp (Trang 38 - 40)