Chương 4: Các phương pháp sắp xếp cơ bản
Định nghĩa bài toán sắp xếp
Phương pháp chọn (Selection sort)
Phương pháp chèn (Insertion sort)
Phương pháp đổi chỗ (Interchange sort)
Phương pháp nổi bọt (Bubble sort)
Phương pháp sắp xếp nhanh (Quick sort)
49 trang |
Chia sẻ: phuongt97 | Lượt xem: 459 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Các phương pháp sắp xếp cơ bản - Ngô Quang Thạch, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CẤU TRÚC DỮ LIỆU VÀ
GIẢI THUẬT
NGÔ QUANG THẠCH
Email: thachnq@gmail.com
ĐT: 01273984123
Chương 4: Các phương pháp sắp xếp cơ bản
Định nghĩa bài toán sắp xếp
Phương pháp chọn (Selection sort)
Phương pháp chèn (Insertion sort)
Phương pháp đổi chỗ (Interchange sort)
Phương pháp nổi bọt (Bubble sort)
Phương pháp sắp xếp nhanh (Quick sort)
Định nghĩa bài toán sắp xếp
Phát biểu bài toán:
- Cho tập n đối tượng (phần tử).
- Hãy sắp xếp n đối tượng trên theo thứ tự tăng (giảm)
Tổ chức dữ liệu
- int n Số phần tử cần sắp xếp
- int A[n] Lưu trữ tập hợp n phần tử
Định nghĩa bài toán sắp xếp
Sắp xếp là một quá trình xử lý bố trí lại một danh sách
các đối tượng theo thứ tự nào đó.
Ví dụ: Cần sắp xếp danh sách thí sinh theo tên với thứ
tự Alphabet, hoặc sắp xếp danh sách sinh viên theo
điểm trung bình với thứ tự từ cao đến thấp.
Các đối tượng cần được sắp xếp thường có nhiều thuộc
tính chúng ta cần chọn một thuộc tính làm khóa và sắp
xếp theo khóa này.
Phương pháp chọn (Selection sort)
1. Ý tưởng
° Ch ọn ph ần tử nh ỏ nh ất trong n ph ần tử đầ u, đưa ph ần tử
này về vị trí đầ u của dãy.
° Ti ếp tục quá trình với n-1 ph ần tử còn lại và bắt đầ u từ vị trí
th ứ 2, lặp lại quá trình trên cho dãy gồm n-1 ph ần tử còn lại.
° Thu ật toán th ực hi ện n-1 lần để lần lượt đưa ph ần tử nh ỏ
nh ất trong dãy hi ện hành về vị trí dẫn đầ u
Phương pháp chọn (Selection sort)
2. Thuật toán
Đầu vào:
n – số phần tử mảng
a – mảng chứa các phần tử bất kỳ
Đầu ra:
a- mảng đã được sắp xếp tăng dần
Bước 1: i = 0
Bước 2: tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i]
đến a[n-1]
Bước 3: Hoán vị a[i] với a[min]
Bước 4:
• nếu i<n-1 thì i = i+1 và lặp lại bướ c 2
• ng ượ c lại thì n-1 ph ần tử đã đượ c sắp xếp => Dừng thu ật toán
Phương pháp chọn (Selection sort)
3. Cài đặt
void SelectionSort(int a[ ], int n)
{
int vtmin, i, j, tg;
for(i=0;i<n-1;i++)
{
vtmin=i;
for(j=i+1; j<n; j++)
if (a[j]<a[vtmin]) vtmin=j;
if(vtmin!=i)// Hoán đổi phần tử a[vtmin] với a[i]
{
tg=a[vtmin]; a[vtmin]=a[i]; a[i]=tg;
}
}
}
Phương pháp chọn (Selection sort)
4. Ví dụ minh họa
Cho dãy số a: a = 12 2 8 5 1 6 4 15
Sắp xếp dãy số tăng dần.
Mô tả các bước chạy khi thực hiện thuật toán với dãy trên
Phương pháp chọn (Selection sort)
i=0 => j = 1 -> 7 và vtmin = 4 => Hoán đổ i a[0] và a[4]
0
i=1 => j = 2 -> 7 và vtmin = 1 => Không hoán đổ i
1
Phương pháp chọn (Selection sort)
i=2 => j = 3 -> 7 và vtmin = 6 => Hoán đổ i a[2] & a[6]
2
i=3 => j = 4 -> 7 và vtmin = 3 => Ko hoán đổ i
3
Phương pháp chọn (Selection sort)
i=4 => j = 5 -> 7 và vtmin = 5 => Hoán đổ i a[4] & a[5]
4
i=5 => j = 6 -> 7 và vtmin = 6 => Hoán đổ i a[5] & a[6]
5
Phương pháp chọn (Selection sort)
i=6 => j = 7 -> 7 và vtmin = 6 => Không hoán đổ i
This image cannot currently be displayed.
6
=> d ừng thu ật toán
Vậy dãy đã sắp xếp là:
a = 1 2 4 5 6 8 12 15
Phương pháp chèn (Insertion sort)
1. Ý tưởng
° Gi ả sử có dãy a0, a 1,,a i-1 đã đượ c sắp xếp. Ý tưở ng của thu ật toán
là chèn thêm ph ần tử mới ai vào vị trí thích hợp của đoạn a1a i-1 sao
cho đượ c dãy mới a1ai đã đượ c sắp xếp
ắ ắ ế ư
° Nguyên t c s p x p nh sau : đoạn gồm ph ần tử a0 đã đượ c sắp xếp,
thêm a1 vào đượ c a0,a 1 đã đượ c sắp xếp, ti ếp tục thêm a2 vào đượ c
a0, a 1, a 2 đã sắp xếpti ếp tục để thêm an vào để đượ c a0,a 1,,a n đã
sắp xếp.
Phương pháp chèn (Insertion sort)
2.Thuật toán
Đầu vào: n – số phần tử mảng
a – mảng chứa các phần tử bất kỳ
Đầu ra: a- mảng đã được sắp xếp tăng dần
Bước 1: i=1 // giả sử a[0] đã được sắp xếp
Bước 2: tìm vị trí pos thích hợp trong đoạn từ a[0] đến a[i-1] để chèn
a[i] vào
Bước 3: đổi chỗ các phần tử từ a[pos] đến a[i-1] sang phải một vị trí để
được vị trí chèn a[i] vào
Bước 4: chèn a[i] vào vị trí pos tìm được bằng cách gán a[pos]=a[i]
Bước 5: i=i+1
Nếu i lặp lại bước 2
Ngược lại => Dừng thuật toán
Phương pháp chèn (Insertion sort)
3. Cài đặt
void InsertionSort(int a[ ], int n)
{
int pos,i,x;
for(i=1;i<n;i++)
{
x=a[i];
pos=i-1;
while((pos>=0)&&(a[pos]>x)) // tìm vị trí chèn a[i]
{
a[pos+1]=a[pos];
pos--;
}
a[pos+1]=x; // chèn x vào dãy
}
}
Phương pháp chèn (Insertion sort)
4. Ví dụ minh họa
Cho dãy số a:
a = 12 2 8 5 1 6 4 15
Sắp xếp dãy tăng dần
Mô tả các bước chạy khi thực hiện thuật toán với dãy trên
Phương pháp chèn (Insertion sort)
i=1 => Cần chèn ph ần t ử a[1] vào dãy a[0] => pos=-1
Vi tri so pos=pos+1
1
i=2 => Cần chèn ph ần t ử a[2] vào dãy a[0],a[1] => pos=1
2
Phương pháp chèn (Insertion sort)
i=3 => Cần chèn ph ần t ử a[3] vào dãy a[0],a[1],a[2] => pos = 1
3
i=4 => Cần chèn ph ần t ử a[4] vào dãy a[0],a[1],a[2],a[3] => pos = 0
4
Phương pháp chèn (Insertion sort)
i=5 => Cần chèn ph ần t ử a[5] vào dãy
a[0],a[1],a[2],a[3],a[4] => pos = 3
i=6 => Cần chèn ph ần t ử a[6] vào dãy 5
a[0],a[1],a[2],a[3],a[4],a[5] => vi tri 2
6
Phương pháp chèn (Insertion sort)
i=7 => Cần chèn ph ần t ử a[7] vào dãy
a[0],a[1],a[2],a[3],a[4],a[5],a[6] => pos = 7
7
=> d ừng
Vậy dãy đã s ắp x ếp là
a = 1 2 4 5 6 8 12 15
Phương pháp đổi chỗ (Interchange sort)
1. Ý tưởng
Xuất phát từ phần 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 với phần tử tương ứng trong cặp nghịch
thế. (Nghịch thế là số lớn đứng trước số nhỏ)
Lặp lại xử lý trên với các phần tử tiếp theo trong dãy.
Phương pháp đổi chỗ (Interchange sort)
2. Thuật toán
Đầu vào:
n – số phần tử mảng
a – mảng chứa các phần tử bất kỳ
Đầu ra:
a- mảng đã được sắp xếp tăng dần
Bước 1: i = 1; // bắt đầu từ đầu dãy
Bước 2: j = i+1;//tìm các phần tử a[j] i
° Nếu a[j]<a[i]: đổ i ch ổ a[i], a[j]; //xét c ặp a[i], a[j]
° j = j+1;
Bước 3 : i = i+1;
° Nếu i < n L ặp l ại b ướ c 2
° Ng ượ c lại: Dừng.
Phương pháp đổi chỗ (Interchange sort)
3. Cài đặt
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ó s ự sai v ị trí thì đổ i ch ỗ
Hoanvi(a[i],a[j]);
}
Phương pháp đổi chỗ (Interchange sort)
4. Ví dụ minh họa
Cho dãy số a:
a = 12 2 8 5 1 6 4 15
Sắp xếp dãy tăng dần
Mô tả các bước chạy khi thực hiện thuật toán với dãy trên
Phương pháp đổi chỗ (Interchange sort)
i=0 => So sánh ph ần t ừ a[0] v ới các ph ần t ử a[j] (j=>1..7)
i=0 j=1
j=2,3 => Các c ặp bình th ườ ng, j=4 c ần điều ch ỉnh
i=0 j=4
Phương pháp đổi chỗ (Interchange sort)
i=1 => So sánh ph ần t ừ a[1] v ới các ph ần t ử a[j] (j=>2..7)
i=1 j=2
i=1 j=3
Phương pháp đổi chỗ (Interchange sort)
i=1 => So sánh ph ần t ừ a[1] v ới các ph ần t ử a[j] (j=>2..7)
i=1 j=4
Phương pháp đổi chỗ (Interchange sort)
i=2 => So sánh ph ần t ừ a[2] v ới các ph ần t ử a[j] (j=>3..7)
i=2 j=3
i=2 j=4
Phương pháp đổi chỗ (Interchange sort)
i=2 j=6
Phương pháp đổi chỗ (Interchange sort)
i=3 => So sánh ph ần t ừ a[3] v ới các ph ần t ử a[j] (j=>4..7)
i=3 j=4
i=3 j=5
Phương pháp đổi chỗ (Interchange sort)
i=3 j=6
Phương pháp đổi chỗ (Interchange sort)
i=4 => So sánh ph ần t ừ a[4] v ới các ph ần t ử a[j] (j=>5..7)
i=4 j=5
i=4 j=6
Phương pháp đổi chỗ (Interchange sort)
i=5 => So sánh ph ần t ừ a[5] v ới các ph ần t ử a[j] (j=>6..7)
i=5 j=6
Phương pháp đổi chỗ (Interchange sort)
i=6 => So sánh ph ần t ừ a[6] v ới các ph ần t ử a[j] (j=>7..7)
i=6
Phương pháp nổi bọt (Bubble sort)
1. Ý tưởng
Xu ất phát t ừ đầ u dãy hay cu ối dãy và ti ến hành đổ i ch ỗ c ặp ph ần
tử k ế c ận nhau để đưa ph ần t ử nh ỏ h ơn ho ặc l ớn h ơn v ề v ị trí cao
nh ất hay th ấp nh ất trong dãy. Sau khi đã chuy ển v ị trí này không
xét n ữa => L ặp l ại quá trình này khi dãy ko còn ph ần t ử nào n ữa
Phương pháp nổi bọt (Bubble sort)
2. Thuật toán
Bước 1: i = 0
Bước 2: j = n-1 // duyệt từ cuối đến ptử thứ i
Trong khi j>i th ực hi ện
nếu a[j] < a[j-1] thì hoán đổ i hai ph ần t ử
j=j-1
Bước 3: i=i+1
Nếu i>=n-1 => Hết dãy và d ừng thu ật toán
Ng ược l ại l ặp l ại b ước 2
Phương pháp nổi bọt (Bubble sort)
3. Cài đặt
void BubbleSort(int a[ ], int n)
{
int i,j,tg;
for(i=0;i<n-1;i++)
for(j=n-1;j>i;j--)
if ( a[ j ] < a[ j-1] )
{
tg = a[ j ];
a[ j ] = a[ j-1];
a[ j-1 ] = tg;
}
}
Phương pháp nổi bọt (Bubble sort)
4. Ví dụ minh họa
Cho dãy số a:
a = 2 12 8 5 1 6 4 15
Sắp xếp dãy tăng dần
Phương pháp nổi bọt (Bubble sort)
2 12
i=0 j=6
i=0 j=4
i=0 j=3
i=0 j=2
i=0 j=1
Phương pháp nổi bọt (Bubble sort)
i=1 j=5
i=1 j=4
i=1 j=3
Phương pháp nổi bọt (Bubble sort)
i=2 j=5
i=2 j=4
Phương pháp nổi bọt (Bubble sort)
i=3 j=6
i=3 j=5
Phương pháp nổi bọt (Bubble sort)
i=4 j=6
i=5
Phương pháp sắp xếp nhanh (Quick sort)
1. Ý tưởng
2. Giải thuật
3. Cài đặt
4. Ví dụ
5. Nhận xét
1. Ý tưởng
Phân hoạch dãy a 1 a2 a n thành 3 thành phần :
- Dãy con 1 : Gồm các phần tử a1 ai có giá trị không lớn
hơn x.(<x)
- Dãy con 2 : Gồm các phần tử a j a n có giá trị không nhỏ
hơn x.(>x)
- Dãy con thứ 3: a i,..a j= x
Với x là giá trị của một phần tử tuỳ ý trong dãy ban đầu.
Sau khi phân hoạch, dãy ban đầu được chia làm 3 phần :
° ak < x, v ớI k=1..i
° ak = x, v ớI k=i..j
° ak > x, v ớI k=j..N
2. Giải thuật
Giải thuật để sắp xếp một dãy alar
Bước 1 : Phân hoạch dãy alar thành các dãy con :
° Dãy con 1 : alaj < x
° Dãy con 2 : aj+1ai-1 = x
° Dãy con 3 : aiar > x
Bước 2 :
° Nếu (l<j) Phân ho ạch dãy alaj
° Nếu (i<r) Phân ho ạch dãy aiar
2. Giải thuật
Giải thuật để phân hoạch một dãy alar thành 2 dãy con:
Bước 1 : Chọn tuỳ ý a[k] làm giá trị mốc l<=k<=r
X = a[k]; i=l, j=r
Bước 2 : Phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] nằm
sai chỗ:
Bước 2a : Trong khi a[i] <x i++;
Bước 2b : Trong khi a[j]>x j--;
Bước 2c : Nếu i<j Hoán vị (a[i],a[j])
Bước 3 :
Nếu i<j : Lặp lại bước 2.
Nếu i>=j : dừng.
3. Cài đặt
void QuickSort (int a[], int l, int r)
{ int i,j,x;
x=a[(l+r)/2];
i=l; j=r;
do
{ while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j)
{ HoanVi(a[i],a[j]);
i++;
j--;
}
} while (i<j);
if (l<j) QuickSort(a,l,j);
if (i<r) QuickSort(a,i,r);
}
4. Ví dụ
Cho dãy số a:
4 9 3 7 5 3 8
j
i i j ji
4 9 3 7 5 3 8
l x r
Đoạn l = 0, r =3, x = a[1] = 3
4 3 3 5
Đoạn l = 4, r =6, x = a[5] = 9
7 9 8
Kết quả
3 3 4 5 7 8 9
Các file đính kèm theo tài liệu này:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_4_cac_phuong.pdf