Sắp xếp chọn

Một phần của tài liệu Tài liệu ĐỀ CƯƠNG CHI TIẾT MÔN HỌC KỸ THUẬT LẬP TRÌNH doc (Trang 56 - 58)

II. Truyền tham số mảng cho hàm

4.Sắp xếp chọn

Biªn so¹n: NguyÔn M¹nh Cêng Trang 5 6

Phương pháp sắp xếp cơ bản thứ 2 là phương pháp chọn. Ý tưởng của phương pháp như sau:

- Nếu a được sắp tăng thì các phần tử đứng sau luôn lớn hơn các phần tử đứng trước.

- Xây dựng một mảng a mới bằng cách: Chọn ra các phần tử nhỏ nhất trong a và đặt chúng theo thứ tự từ trái qua phải. Các phần tử đã được chọn sẽ không được xét trong các lần chọn tiếp theo.

Bảng sau cho thấy quá trình sắp xếp mảng a gồm 6 phần tử. Với mỗi bước sắp, ta tính Min của các phần tử còn lại (phần tử được bôi đen).

3 5 2 7 4 8 Min = 2 2 5 3 7 4 8 Min = 3 2 3 5 7 4 8 Min = 4 2 3 4 7 5 8 Min = 5 2 3 4 5 7 8 Min = 7 2 3 4 5 7 8 Min = 8 Sau đây là hàm sắp xếp chọn

void SapChon(int a[100], int n) {

for (int i=0; i<n-1; i++) {

int min = i;

for (int j = i+1; j<n; j++)

if (a[j] < a[min]) min = j; int tg = a[i]; a[i] = a[min]; a[min]=tg; } } Sắp xếp bằng phương pháp chọn cần n2/ 2 lần so sánh và n lần hoán vị. 5. Sắp xếp chèn

Phương pháp này xuất phát từ ý tưởng:

- Nếu mảng a có duy nhất 1 phần tử thì nó đã được sắp.

- Nếu bổ sung một phần tử nữa vào a thì phần tử bổ sung cần được đặt ở vị trí sao cho không thay đổi tính được sắp của các phần tử đã có.

Như vậy, có thể hình dung phương pháp này bằng là việc xây dựng một mảng mới bằng cách lấy lần lượt các phần tử của a và chèn vào một mảng a mới sao cho không phá vỡ tính được sắp của các phần tử đã sắp.

3 Phần tử đầu tiên 3 5 Chèn 5 vào 2 3 5 Chèn 2 vào 2 3 5 7 Chèn 7 vào 2 3 4 5 7 Chèn 4 vào 2 3 4 5 7 8 Chèn 8 vào

Ta xem xét quá trình chèn một phần tử vào mảng mới (giả sử chèn 2 vào). Khi đó, các phần tử 3 và 5 đã được chèn và quá trình diễn ra như sau:

B1: Lấy phần tử 2 (a[i] ; i = 2) để ra một biến trung gian Tg. B2: j = i-1 = 1; a[j] > Tg; dịch chuyển a[j] sang phải 1 vị trí. B3: j = j -1 = 0; a[j] > Tg; dịch chuyển a[j] sang phải 1 vị trí. B4: j = j -1 = -1; Lúc này j < 0 nên chèn Tg vào a[j+1].

Như vậy quá trình dịch chuyển sang phải sẽ kết thúc nếu a[j] < = Tg hoặc J < 0. Khi đó chỉ cần chèn Tg vào vị trí a[j+1].

void SapChen(int a[100], int n) {

for (int i=1; i< n; i++) {

int Tg = a[i]; int j = i-1; while (a[j] > Tg && j >=0) { a[j+1] = a[j]; j--; } a[j+1]=Tg; } }

Sắp xếp bằng phương pháp chèn trong trường hợp trung bình cần n2/ 4 lần so sánh và n2/ 8 lần hoán vị. Trường hợp tồi nhất gấp đôi số lần này.

Một phần của tài liệu Tài liệu ĐỀ CƯƠNG CHI TIẾT MÔN HỌC KỸ THUẬT LẬP TRÌNH doc (Trang 56 - 58)