You are on page 1of 3

1.

Ý tưởng:
- Chạy từ đầu đến cuối mảng
- Tại vòng lặp i, coi như dãy từ [0, i-1] đã được sắp xếp, chèn phần tử a[i] vào vị trí thích
hợp.
+ So sánh a[i] với các phần tử trước nó.
+ Nếu a[i] nhỏ hơn, di chuyển phần tử lớn hơn lên một vị trí.
- Sau vòng lặp thứ i thì dãy [0, i] đã được sắp xếp.

2. Ví dụ:

3. Chứng minh tính đúng:


Sau lần lặp i (từ 1 đến n), các phần tử từ 0 đến I là được sắp xếp theo thứ tự.
Chứng minh: quy nạp theo i.
- Khi i=1, dãy gồm một phần tử a[i] là dãy được sắp xếp.
- Giả sử sau lần lặp i-1 (i>1), dãy a[1],…,a[i-1] là được sắp xếp theo thứ tự
Ở lần lặp thứ I, ta sẽ sắp xếp phần tử mới a[i] (được gán vào last) vào đúng chỗ
của nó trong dãy gồm I phần tử đầu tiên. Để ý rằng ta gán a[j] bằng a[j-1] nếu a[j-
1] lớn hơn phần tử mới (last). Sau đó ta tiếp tục di chuyển sang trái, cho đến khi
gặp phần tử đầu tiên nhỏ hơn last (a[j-1] <= last).
Theo giả thiết quy nạp, đoạn gồm i-1 phần tử đầu được sắp xếp theo thứ tự, còn
theo lập luận vừa nêu thì phần tử mới thêm vào được xếp đúng chỗ, vì thế dãy
thu được là được sắp xếp theo thứ tự.

4. Tính độ phức tạp:


n −1
( n−1 ) n
∑ i=1+ 2+ 3+…+( n−1 )= 2
=O ( n )
2

i=1

5. Code:
    public static void insertionSort(int[] a) {
        int n = a.length;
        for (int i = 1; i < n; i++) {
            int key = a[i];
            int j = i-1;
            while (j >= 0 && a[j] > key) {
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = key;
        }
    }

6. Đồ thị

You might also like