Bài toán sắp xếp: Là quá trình xử lý một danh sách
các phần tử (hoặc các mẫu tin) để đặt chúng theo một
thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội
dung thông tin lưu giữ tại mỗi phần tử.
Lưu ý: Thứ tự đề cập ở đây là một thứ tự tổng quát.
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}
40 trang |
Chia sẻ: thuychi16 | Lượt xem: 859 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Cấu trúc dữ liệu và giải thuật - Các giải thuật sắp xếp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
G V : L Ê T H Ị N GỌC HẠN H
CÁC GIẢI THUẬT SẮP XẾP
9/4/2015 Data structure & Algorithms
1
GIỚI THIỆU BÀI TOÁN SẮP XẾP
Bài toán sắp xếp: Là quá trình xử lý một danh sách
các phần tử (hoặc các mẫu tin) để đặt chúng theo một
thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội
dung thông tin lưu giữ tại mỗi phần tử.
Lưu ý: Thứ tự đề cập ở đây là một thứ tự tổng quát.
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}
9/4/2015 Data structure & Algorithms 2
GIỚI THIỆU BÀI TOÁN SẮP XẾP
Khái niệm “Nghịch thế”
Xét một mảng các số a0, a1, , an
Nếu có iaj thì ta gọi đó là một nghịch
thế.
Mảng chưa sắp xếp sẽ có nghịch thế
Mảng đã có thứ tự sẽ không chứa nghịch thế
9/4/2015 Data structure & Algorithms 3
CÁC PHƯƠNG PHÁP SẮP XẾP
Quick sort
Merge sort
Radix sort Shaker sort
Radix sort
9/4/2015 Data structure & Algorithms 4
Selection sort
Insertion sort
Interchange sort
Bubble sort
Shaker sort
Binary Insertion sort
ĐỔI CHỖ TRỰC TIẾP – INTERCHANGE
SORT
Ý tưởng:
Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa
phần tử này triệt tiêu chúng bằng cách đổi chỗ
phần tử này tử này với phần tử tương ứng trong
cặp nghịch thế.
Lặp lại xử lý trên với các phần tử tiếp theo trong
dãy.
9/4/2015 Data structure & Algorithms 5
INTERCHANGE SORT – THUẬT TOÁN
Bước 1: Khởi tạo i=0 // bắt đầu từ đầu dãy
Bước 2: j = i+1; //tìm các cặp a[j]I
Bước 3: Trong khi j<n thực hiện:
Nếu a[j]<a[i] thì hoán vị a[i] và a[j];
j=j+1;
Bước 4: i=i+1;
Nếu i<n-1 thì lặp lại bước 2
Ngược lại: dừng
9/4/2015 Data structure & Algorithms 6
INTERCHANGE SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 7
9/4/2015 Data structure & Algorithms 8
INTERCHANGE SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 9
INTERCHANGE SORT – VÍ DỤ
Void InterchangeSort(int a[], int n)
{
int i, j;
for(i = 0 ; i<n-1 ; i++)
for(j = i+1;j<n; j++)
if(a[j]< a[i])//nếu có
nghịch thế thì đổi chỗ
Swap(a[i],a[j]);
}
9/4/2015 Data structure & Algorithms 10
INTERCHANGE SORT – CÀI ĐẶT
Số lượng các phép so sánh xảy ra không phụ
thuộc vào tình trạng của dãy số ban đầu.
Số lượng phép hoán vị thực hiện tùy thuộc vào
kết quả so sánh
9/4/2015 Data structure & Algorithms 11
INTERCHANGE SORT – ĐÁNH GIÁ
SẮP XẾP CHỌN – SELECTION SORT
9/4/2015 Data structure & Algorithms 12
SELECTION SORT – Ý TƯỞNG
Chọn phần tử nhỏ nhất đặt vào vị trí đầu tiên
Chọn phần tử nhỏ nhất trong số n-1 phần tử
còn lại đặt vào vị trí thứ 2.
Lặp lại quá trình cho đến khi mảng chỉ còn 1
phần tử.
9/4/2015 Data structure & Algorithms 13
SELECTION SORT – THUẬT TOÁN
Bước 1: Khởi tạo i = 0.
Bước 2: Khởi đầu min = i, j = i+1
Bước 3: Nếu a[j]<a[min] thì min = j, nếu không thì
sang bước 4
Bước 4: Tăng j thêm 1 đơn vị.
Bước 5: Nếu j<n thì quay lại bước 3, nếu không sang
bước 6
Bước 6: Đổi chỗ a[min] và a[i], tăng i lên 1 đơn vị
Bước 7: Nếu i<n-1 thì quay lại bước 2, nếu không thì
kết thúc.
9/4/2015 Data structure & Algorithms 14
SELECTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 15
9/4/2015 Data structure & Algorithms 16
SELECTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 17
SELECTION SORT – VÍ DỤ
SELECTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 18
SELECTION SORT – CÀI ĐẶT
void SelectionSort(int a[],int n)
{
int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hành
for(int i=0; i<n-1 ; i++)
{
min = i;
for(int j = i+1; j < n ; j++)
if (a[j] < a[min])
min = j; // ghi nhận vị trí phần tử nhỏ nhất
if(min != i)
hoanvi(a[min],a[i]);
}
}
9/4/2015 Data structure & Algorithms 19
SELECTION SORT – ĐÁNH GIÁ
Số phép so sánh:
Tại lượt i bao giờ cũng cần (n-i-1) số lần so sánh
Không phụ thuộc vào tình trạng dãy số ban đầu
Số phép so sánh:
9/4/2015 Data structure & Algorithms 20
Số phép gán:
Tốt nhất:
Xấu nhất:
9/4/2015 Data structure & Algorithms 21
SELECTION SORT – ĐÁNH GIÁ
9/4/2015 Data structure & Algorithms 22
CHÈN TRỰC TIẾP – INSERTION SORT
CHÈN TRỰC TIẾP – Ý TƯỞNG
- Tại bước thứ i thì các phần tử từ a[0] đến a[i-1]đều
có thứ tự tăng dần.
- Đầu tiên ta bắt đầu với i=1(a[0] không cần sắp)
- Tìm vị trí thích hợp để chèn a[1] vào đoạn
a[0]a[1]
Kế tiếp, tìm vị trí thích hợp để chèn a[2] vào
đoạn a[0]a[2]
Làm tiếp tục cho đến khi sắp được phần tử cuối
cùng.
9/4/2015 Data structure & Algorithms 23
INSERTION SORT – THUẬT TOÁN
Bước 1: khởi tạo i=1
Bước 2: pos= i-1, x=a[i]
Bước 3: Nếu x<a[pos] thì sang bước 4 không thì sang
bước 6.
Bước 4: Dời a[pos] sang phải: a[pos+1]=a[pos], giảm
pos 1 đơn vị.
Bước 5: Nếu pos>=0 thì quay lại bước 3, nếu không
sang bước 6.
Bước 6: Gán a[pos+1]=x, tăng i thêm 1 đơn vị
Bước 7: Nếu i<n thì quay lại bước 2, không thì kết thúc
9/4/2015 Data structure & Algorithms 24
INSERTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 25
9/4/2015 Data structure & Algorithms 26
INSERTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 27
INSERTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 28
INSERTION SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 29
INSERTION SORT – VÍ DỤ
void InsertionSort(int a[],int n)
{
int pos;
int x; //lưu trữa[i] tránh bị ghi đè khi dời
chỗ các phần tử.
for(int i=1;i<n;i++) //đoạn a[0]đãsắp
{
x = a[i];
for(pos=i;(pos>0)&&(a[pos-1]>x);pos--)
a[pos] = a[pos-1];
a[pos] = x; // chèn x vào dãy
}
}
9/4/2015 Data structure & Algorithms 30
INSERTION SORT – CÀI ĐẶ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ượng trong trường hợp
sau:
9/4/2015 Data structure & Algorithms 31
INSERTION SORT – ĐÁNH GIÁ
9/4/2015 Data structure & Algorithms 32
SẮP XẾP NỔI BỌT – BUBBLE SORT
BUBBLE SORT – Ý TƯỞNG
- Đưa dần các phần tử có khóa (giá trị) nhỏ về phía
trước.
- 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ỏ(lớn) hơn trong cặp phần tử đó cận
để đưa phần tử nhỏ (lớn) hơn trong cặp phần tử đó về vị trí
đứng đầu (cuối) dãy hiện hành, sau đó sẽ không xét đến nó
ở bước tiếp theo.
- Ở lần xử lý thứ i có vị trí đầu dãy là i.
- Lặp lại xử lý trên cho đến khi không còn cặp phần tử nào
để xét.
9/4/2015 Data structure & Algorithms 33
Bước 1: khởi tạo i=0
Bước 2: j=n-1; //duyệt từ cuối dãy ngược về vị
trí i
Bước 3: trong khi j>i thực hiện
Nếu a[j]<a[j-1] thì hoán vị a[j] và a[j-1]
j=j-1
Bước 4: i=i+1; //lần xử lý kế tiếp
Nếu i=n-1: dừng. //hết dãy
Ngược lại: Lặp lại bước 2.
9/4/2015 Data structure & Algorithms 34
BUBBLE SORT – THUẬT TOÁN
9/4/2015 Data structure & Algorithms 35
BUBBLE SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 36
BUBBLE SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 37
BUBBLE SORT – VÍ DỤ
9/4/2015 Data structure & Algorithms 38
BUBBLE SORT – VÍ DỤ
void BubbleSort(int a[], int n)
{
int i, j;
for (i = 0 ; i<n-1; i++)
for (j = n-1; j>i ; j --)
if(a[j]< a[j-1])
swap(a[j], a[j-1]);
}
9/4/2015 Data structure & Algorithms 39
BUBBLE SORT – CÀI ĐẶT
Số lượng các phép so sánh xảy ra không phụ
thuộc vào tình trạng của dãy số ban đầu.
Số lượng phép hoán vị thực hiện tùy thuộc
vào kết quả so sánh.
9/4/2015 Data structure & Algorithms 40
BUBBLE SORT – ĐÁNH GIÁ