You are on page 1of 9

TRƯỜNG THPT CHUYÊN BẮC NINH

************

DỰ ÁN HỌC TẬP MÔN TIN HỌC


ĐỀ TÀI: “THUẬT TOÁN SẮP XẾP CHÈN”

GIÁO VIÊN : Hoàng Thị Hà


TÁC GIẢ : Nhóm 1 – Lớp 11 Toán 1
THÀNH VIÊN :

1. Ngô Thế Xuân Anh


2. Nguyễn Thế Anh
3. Vương Đình Bắc
4. Lê Quỳnh Chi
5. Nguyễn Thành Công
6. Lê Huy Dũng
I) PHÁT BIỂU THUẬT TOÁN

 Sắp xếp chèn là mộ t thuậ t toá n sắ p xếp đặ t mộ t phầ n tử


chưa đượ c sắ p xếp và o vị trí thích hợ p củ a nó trong mỗ i lầ n
lặ p.

 Sắ p xếp chèn hoạ t độ ng tương tự như chú ng ta sắ p xếp cá c


quâ n bà i trên tay trong mộ t trò chơi bà i.

 Giả định rằ ng thẻ đầ u tiên đã đượ c sắ p xếp sau đó , chọ n mộ t


thẻ chưa đượ c sắ p xếp. Nếu thẻ chưa đượ c phâ n loạ i lớ n hơn
thẻ trên tay, nó đượ c đặ t ở bên phả i, ngượ c lạ i, ở bên
trá i. Theo cá ch tương tự , cá c thẻ chưa đượ c phâ n loạ i khá c
đượ c lấ y và đặ t và o đú ng vị trí củ a chú ng.

II) Ý TƯỞNG THUẬT TOÁN VÀ MÔ PHỎNG

A. Ý tưởng:
Thuật toán sắp xếp chèn thực hiện sắp xếp dãy số theo cách duyệt từng phần tử
và chèn từng phần tử đó vào đúng vị trí trong mảng con(dãy số từ đầu đến phần
tử phía trước nó) đã sắp xếp sao cho dãy số trong mảng sắp đã xếp đó vẫn đảm
bảo tính chất của một dãy số tăng dần.

1. Khở i tạ o mả ng vớ i dã y con đã sắ p xếp có k = 1 phầ n


tử (phầ n tử đầ u tiên, phầ n tử có chỉ số 0)
2. Duyệt từ ng phầ n tử từ phầ n tử thứ 2, tạ i mỗ i lầ n duyệt
phầ n tử ở chỉ số i thì đặ t phầ n tử đó và o mộ t vị trí nà o đó
trong đoạ n từ [0…i] sao cho dã y số từ [0…i] vẫ n đả m bả o
tính chấ t dã y số tă ng dầ n. Sau mỗ i lầ n duyệt, số phầ n tử đã
đượ c sắ p xếp k trong mả ng tă ng thêm 1 phầ n tử .
3. Lặ p cho tớ i khi duyệt hết tấ t cả cá c phầ n tử củ a mả ng.

B. Mô phỏng và giải thuật:


 Mô phỏng thuật toán:
 Ví dụ chúng ta có một mảng gồm các phần tử không có
thứ tự:

 Giải thuật sắp xếp chèn so sánh hai phần tử đầu tiên:

Giải thuật tìm ra rằng cả 14 và 33 đều đã trong thứ tự tăng dần.

 Bây giờ, 14 là trong danh sách con đã qua sắp xếp.

Giải thuật sắp xếp chèn tiếp tục di chuyển tới phần tử kế tiếp

 So sánh 33 và 27.

 Và thấy rằng 33 không nằm ở vị trí đúng.

Giải thuật sắp xếp chèn tráo đổi vị trí của 33 và 27. Đồng thời
cũng kiểm tra tất cả phần tử trong danh sách con đã sắp xếp.

 Tại đây, chúng ta thấy rằng trong danh sách con này chỉ
có một phần tử 14 và 27 là lớn hơn 14. Do vậy danh sách
con vẫn giữ nguyên sau khi đã tráo đổi.
 Bây giờ trong danh sách con chúng ta có hai giá trị 14
và 27. Tiếp tục so sánh 33 với 10.

 Hai giá trị này không theo thứ tự.

 Vì thế chúng ta tráo đổi chúng.

 Việc tráo đổi dẫn đến 27 và 10 không theo thứ tự.

 Vì thế chúng ta cũng tráo đổi chúng.

 Chúng ta lại thấy rằng 14 và 10 không theo thứ tự.

 Và chúng ta tiếp tục tráo đổi hai số này. Cuối cùng, sau
vòng lặp thứ 3 chúng ta có 4 phần tử.
 Tiến trình trên sẽ tiếp tục diễn ra cho tới khi
tất cả giá trị chưa được sắp xếp được sắp
xếp hết vào trong danh sách con đã qua sắp
xếp.

 Giải thuật thuật toán:


Từ minh họa trên chúng ta đã có bức tranh tổng quát về giải
thuật sắp xếp chèn, từ đó chúng ta sẽ có các bước cơ bản
trong giải thuật như sau:

Bước 1: Kiểm tra nếu phầ n tử đầ u tiên đã đượ c sắ p xếp. trả về 1

Bước 2: Lấ y phầ n tử kế tiếp

Bước 3: So sá nh vớ i tấ t cả phầ n tử trong danh sá ch con đã qua


sắ p . xếp

Bước 4: Dịch chuyển tấ t cả phầ n tử trong danh sá ch con mà lớ n


hơn . giá trị để đượ c sắ p xếp

Bước 5: Chèn giá trị đó

Bước 6: Lặ p lạ i cho tớ i khi danh sá ch đượ c sắ p xếp

III) MINH HỌA THUẬT TOÁN BẰNG NGÔN NGỮ LẬP TRÌNH:

 Thuật toán sắp xếp chèn:


 Sắp xếp chèn trong C++

 Input:
#include <stdio.h>
#include <math.h>
/* Hàm sắp xếp sử dụng thuật toán sắp xếp chèn */
void insertionSort(int arr[], int n)
{
int i, key, j;
for (i = 1; i < n; i++)
{
key = arr[i];
j = i-1;

/* Di chuyển các phần tử có giá trị lớn hơn giá trị key về sau một vị
trí so với vị trí ban đầu của nó */
while (j >= 0 && arr[j] > key)
{
arr[j+1] = arr[j];
j = j-1;
}
arr[j+1] = key;
}
}

/* Hàm xuất mảng */


void printArray(int arr[], int n)
{
int i;
for (i=0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}

int main()
{
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr)/sizeof(arr[0]);

insertionSort(arr, n);
printf("Sorted array: \n");
printArray(arr, n);

return 0;
}

 Output:

Sorted array:
5 6 11 12 13

IV) ĐÁNH GIÁ ĐỘ PHỨC TẠP SẮP XẾP CHÈN:


Thời gian phức tạp

Thời gian phức tạp


Tốt nhất O(n)
Tồi nhất O(n2)
Trung bình O(n2 )
Không gian phức tạp O(1)
Sự ổn định Đú ng

Độ phức tạp của trường hợp tồi tệ nhất:


Giả sử , mộ t mả ng có thứ tự tă ng dầ n và bạ n muố n sắ p xếp
nó theo thứ tự giả m dầ n. Trong trườ ng hợ p nà y, trườ ng hợ p
xấ u nhấ t phứ c tạ p xả y ra. Mỗ i phầ n tử phả i đượ c so sá nh vớ i
mỗ i phầ n tử khá c, do đó , đố i vớ i mỗ i phầ n tử thứ n, số lầ n so
sá nh đượ c thự c hiện. Như vậ y, tổ ng số phép so sá nh =O(n2):
n*(n-1) ~ n2
Độ phức tạp của trường hợp tốt nhất: O(n)
Khi mả ng đã đượ c sắ p xếp, vò ng lặ p bên ngoà i chạ y vớ i nsố
lầ n trong khi vò ng lặ p bên trong hoà n toà n khô ng chạ y. Vì
vậ y, chỉ có mộ t nsố so sá nh. Do đó , độ phứ c tạ p là tuyến tính.
Độ phức tạp của trường hợp trung bình: Nó xả y ra khi cá c
phầ n tử củ a mộ t mả ng có thứ tự lộ n xộ n (khô ng tă ng dầ n
cũ ng khô ng giả m dầ n).O(n2)

Không gian phức tạp:


Khô ng gian phứ c tạ p là O(1)do mộ t biến phụ keyđượ c sử
dụ ng.

Ứng dụng sắp xếp chèn:


Sắ p xếp chèn đượ c sử dụ ng khi:
 Mả ng có mộ t số phầ n tử nhỏ
 Chỉ cò n lạ i mộ t số yếu tố đượ c sắ p xếp
Giải thích độ phức tạp:
Do có 2 for lồ ng và o nhau

Thuật toán sử dụng trung bình n2 /4 phép so sánh và


n2 /4 lần hoán vị, n2 /2 phép so sánh và n2 /2 lần
hoán vị trong trường hợp xấu nhất, n-1 phép so sánh và 0 lần
hoán vị trong trường hợp tốt nhất. Thuật toán thích hợp đối
với mảng đã được sắp xếp một phần hoặc mảng có kích
thước nhỏ.

You might also like