Tải bản đầy đủ (.pdf) (32 trang)

Thuật toán sắp xếp kỹ thuật lập trình đại học KHTN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (837.94 KB, 32 trang )

Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin

KỸ THUẬT LẬP TRÌNH

SẮP XẾP

1


Nội dung
Giới thiệu

Các thuật toán sắp xếp

2


Giới thiệu
• Bài toán sắp xếp: Sắp xếp là quá trình xử lý
một danh sách các phần tử để đặt chúng theo
một thứ tự thỏa mãn …
Ví dụ: danh sách trước khi sắp xếp:
{1, 25, 6, 5, 2, 37, 40}
Danh sách sau khi sắp xếp:
{1, 2, 5, 6, 25, 37, 40} -> sắp xếp giúp cho việc tìm

kiếm được nhanh hơn.
• Khi khảo sát các bài toán sắp xếp, ta phải làm
việc nhiều với khái niệm nghịch thế
3




Giới thiệu
Nghịch thế:
Xét một mảng các số a0, a1, …, an-1
Nếu i<j và ai > aj thì ta gọi đó là một nghịch thế.
Nhận xét:
 Mảng chưa sắp xếp sẽ có nhiều nghịch thế.
 Mảng đã sắp xếp tăng không chứa nghịch
thế.
 Việc sắp xếp mảng là nhằm tìm cách giảm số
nghịch thế bằng cách hoán vị các cặp ai, aj
4


Giới thiệu
• Các phương pháp sắp xếp thông dụng:
– Selection Sort
– Insertion Sort
– Bubble Sort
– Interchange Sort
– Quick Sort
– Merge Sort
– Heap Sort
– Radix Sort
Cần tìm hiểu các phương pháp sắp xếp và lựa
chọn phương pháp phù hợp khi sử dụng.
5



Selection Sort
Mô phỏng cách sắp xếp tự nhiên nhất trong
thực tế
 Chọn phần tử nhỏ nhất và đưa về vị trí đúng
là đầu dãy hiện hành.
 Sau đó xem dãy hiện hành chỉ còn n-1 phần
tử.
 Lặp lại cho đến khi dãy hiện hành chỉ còn 1
phần tử.

6


Selection Sort
Các bước của thuật toán:
1. i = 0.
2. Tìm min sao cho:
a[min] nhỏ nhất trong dãy từ a[i] đến a[n-1]
3. Hoán vị a[min] và a[i]
4. Tăng i lên 1
5. Nếu i < n thì lặp lại bước 2
Ngược lại: Dừng thuật toán

7


Selection Sort
0

1


2

3

4

5

6

7

i=0

15

2

8

7

3

6

9

17


i=1

2

15

8

7

3

6

9

17

i=2

2

3

8

7

15


6

9

17

i=3

2

3

6

7

15

8

9

17

i=4

2

3


6

7

15

8

9

17

i=5

2

3

6

7

8

15

9

17


i=6

2

3

6

7

8

9

15

17

i=7

2

3

6

7

8


9

15

17

Ví dụ:

8


Selection Sort

• Mã giả:
void SelectionSort(int a[], int n)
{
int min; //chỉ số của phần tử nhỏ nhất
for(int i=0; i{
min = _____;
for(int j = i+1; j{
if(_______)
min = j; //ghi nhận lại vị trí
}
HoanVi(a[min], a[i]);
}
}
9



Selection Sort
Mô tả tình trạng dãy A sau mỗi bước chạy với
thuật toán Selection sort.
A = {2, 9, 5, 12, 20, 15, -8, 10}

10


Insertion Sort
• Cách xếp các quân bài dùng thuật toán
Insertion Sort:

– Tay trái là dãy các quân bài đã có thứ tự, khi
cầm 1 quân bài mới lên thì tìm vị trí đúng của
nó và chèn vào.
– Cách tìm: lần lượt so sánh quân bài mới với
các quân bài trong dãy ban đầu.
14


Insertion Sort
Giải thuật:
 Xem dãy a0, a1, …, an-1 có i phần tử đầu tiên
a0, a1, …, ai-1 đã có thứ tự.
 Tìm cách chèn phần tử ai vào vị trí thích hợp
để dãy a0, a1, …, ai có thứ tự.
 Cho dãy ban đầu a0, a1, …, an-1, có thể xem
như đoạn gồm 1 phần tử a0 đã được sắp.

 Thêm vào a1 sẽ có a0, a1 được sắp, tiếp tục
thêm a2, a3 cho đến khi thêm an-1
15


Insertion Sort
Các bước của thuật toán:
1. Xuất phát từ i = 1.
2. Tìm vị trí pos thích hợp trong đoạn a[0] đến a[i-1] để
chèn a[i].
3. Dời chỗ các phần tử từ a[pos] đến a[i-1] sang 1 vị trí
để chèn a[i].
4. a[pos] = a[i]
5. Tăng i.
5.1 Nếu i ≤ n: lặp lại bước 2
5.2 Ngược lại: dừng

16


Insertion Sort
Ví dụ: sắp xếp dãy a 15 2 8 7 3 6 9 17
i=1

15

2

8


7

3

6

9

17

i=2

2

15

8

7

3

6

9

17

i=3


2

8

15

7

3

6

9

17

i=4

2

7

8

15

3

6


9

17

i=5

2

3

7

8

15

6

9

17

i=6

2

3

6


7

8

15

9

17

i=7

2

3

6

7

8

9

15

17
17



• Mã giả:
void InsertionSort(int a[], int n)
{
for(int i=1; i{
int x = a[i], pos = i-1;
while(pos>=0 && a[pos] > x) //tìm pos
{
_____________; //dời về sau 1 vị trí
pos--;
}
a[pos+1] = x;
}
}
18


Insertion Sort
Cho biết trạng thái của dãy sau mỗi lần chèn 1
phần tử khi dùng thuật toán Insertion Sort để
sắp xếp mảng A giảm dần.
A = {2, 9, 5, 12, 20, 15, -8, 10}

19


Insertion Sort
Nhận xét:
 Đoạn a[0] đến a[i-1] luôn luôn được sắp:
• Việc tìm vị trí chèn có thể dùng giải thuật tìm kiếm

nhị phân.
• Nếu dùng giải thuật tìm kiếm nhị phân thì phải trả
giá cho thao tác dời các phần tử sau x.

20


Bubble Sort
Giải thuật:
 Xuất phát từ cuối (đầu) dãy, đổi chỗ các cặp
phần tử kế cận để đưa phần tử nhỏ hơn về vị
trí đúng đầu dãy hiện hành.
 Sau đó không xét đến nó ở bước kế tiếp.
 Lần xử lý thứ i sẽ có vị trí đầu dãy là i.
 Gặp lại cho đến khi không còn cặp phần tử
nào để xét.

23


Bubble Sort
Ví dụ: sắp xếp dãy a: 15 2 8 7 3 6 9 17
i=0

j=4

15

2


8

7

3

6

9

17

i=0

j=3

15

2

8

3

7

6

9


17

i=0

j=1

15

2

3

8

7

6

9

17

i=1

j=5

2

15


3

8

7

6

9

17

i=1

j=4

2

15

3

8

6

7

9


17

i=1

j=2

2

15

3

6

8

7

9

17

i=2

j=5

2

3


15

6

8

7

9

17

i=2

j=3

2

3

15

6

7

8

9


17

24


Bubble Sort
Ví dụ: (tt)
i=3 j=4

2

3

6

15

7

8

9

17

i=4 j=5

2

3


6

7

15

8

9

17

i=5 j=6

2

3

6

7

8

15

9

17


i=6 j=7

2

3

6

7

8

9

15

17

2

3

6

7

8

9


15

17

25


Bubble Sort
Mã giả
void BubbleSort(int a[], int n)
{
for(int i=0; i<___ ; i++)
{
for(int j = ___; j>i; j--)
{
if(_______)//nếu sai vị trí thì
HoanVi(a[j],a[j-1]);
}
}
}

đổi chỗ

26


Bubble Sort
Mô tả tình trạng dãy A sau mỗi bước chạy với
thuật toán Bubble sort.

A = {2, 9, 5, 12, 20, 15, -8, 10}

27


Bubble Sort
Nhận xét: Bubble sort có các khuyết điểm:
 Không nhận diện được tình trạng dãy đã có
thứ tự hay không có thứ tự từng phần.
 Trong khi phần tử nhỏ được đưa về vị trí
đúng rất nhanh, thì các phần tử lớn lại được
đưa về vị trí đúng rất chậm.
Giải thuật Shaker sort cải tiến các khuyết
điểm này.

30


Shaker Sort
Cải tiến:
 Duyệt mảng theo 2 lượt từ 2 phía khác nhau:
• Lượt đi: đẩy phần tử nhỏ về đầu mảng
• Lượt về: đẩy phần tử lớn về cuối mảng.

 Ghi nhận lại những đoạn đã đúng vị trí.

31


Shaker Sort

Ví dụ: minh họa Shaker sort
l = 0 r =7

l = 1 r =7

15

2

8

7

3

6

9

17

15

2

8

3

7


6

9

17

15

2

3

8

7

6

9

17

2

15

3

8


7

6

9

17

2

3

15

8

7

6

9

17

2

3

8


15

7

6

9

17

2

3

8

7

15

6

9

17

k=1

32



×