Selection Sort Sắp xếp chọn trực tiếpvà đưa lên đầu nhóm chúng ta còn lại N-1 phần tử đứng ở phía sau dãy M chưa có thứ tự.. Chúng ta tiếp tục chọn phần tử có giá trị nhỏ nhất trong
Trang 1CHƯƠNG II : MỘT SỐ THUẬT TOÁN TÌM KIẾM VÀ SẮP XẾP
CHƯƠNG III : DANH SÁCH LIÊN KẾT - NGĂN XẾP VÀ HÀNG ĐỢI CHƯƠNG IV : CÂY
Trang 31 Nhập & Xuất mảng #define size 200
int a[size];
void main() {
int n, i;
//Nhap so phan tu cin >> n
Trang 4}
Trang 5a[i] = x;
}
}
Trang 60 1 2 3 4 5 6 7 8
2 Xóa 1 phần tử x trong mảng tại vị trí thứ k
n=6 n=5
Trang 91 Tuần tự
Giải thuật :
Bước 1 : Cho i = 0
Bước 2 : Nếu a[i] == x thì dừng chương trình, xuất kết quả tìm thấy
Bước 3 : Ngược lại tăng i lên một đơn vị
Bước 4 : Lặp lại bước 2 và 3 đến khi i >= n thì qua bước 5
Bước 5 : Kết luận không tìm thấy
Trang 10ngược lại tăng i thêm 1
Lặp lại thực hiện đến khi i >= n
Trả về kết quả tìm không thấy
Hàm Sequence_Search
Cho i = 0
Thực hiện
Nếu a[i] == x thì dừng ct, trả về kết quả tìm thấy
ngược lại tăng i thêm 1 Lặp lại thực hiện đến khi i >= n
Trả về kết quả tìm không thấy
int Sequence_Search (int a[ ], int n, int x) {
int i = 0;
do {
if (a[i] == x)
return i;
else i++;
if (a[i] == x)
return i;
else i++;
Trang 11= 5
a[m]
m=(Left + Right)/2 = (6+11)/2
= 8
a[m]
m=(Left + Right)/2 = (9+11)/2
Trang 12= 5
a[m]
m=(Left + Right)/2 = (6+11)/2
= 8
a[m]
m=(Left + Right)/2 = (6+7)/2
Trang 13= 5
a[m]
m=(Left + Right)/2 = (6+11)/2
= 8
a[m]
m=(Left + Right)/2 = (6+7)/2
= 7
a[m]
Trang 142 Nhị Phân
Ý Tưởng :
Phạm vi tìm kiếm ban đầu của chúng ta là từ phần tử đầu tiên của dãy (Left = 1) cho đến phần tử cuối cùng của dãy (Right = N)
So sánh giá trị X với giá trị phần tử đứng ở giữa của dãy M là M[Mid]
Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm về nửa đầu của dãy M (Right = Mid–1)
Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm về nửa sau của dãy M (Left = Mid+1)
Lặp lại quá trình này cho đến khi tìm thấy phần tử có giá trị X hoặc phạm vi tìm kiếm của chúng ta không còn nữa (Left > Right)
Trang 152 Nhị Phân
Giải thuật :
Bước 1 : Cho L = 0; R = n-1
Bước 2 : m = (L + R) /2
Bước 3 : Nếu a[m] = x thì dừng ct, báo kết quả
Bước 4 : Nếu x > a[m] thì tăng L lên m + 1
Bước 5 : Ngược lại giảm R xuống m - 1
Bước 6 : Lặp lại bước 2,3,4,5,
cho đến khi L > R thì qua bước 7
Bước 7 : Kết luận không tìm thấy
Trang 162 Nhị Phân
Giải thuật:
Hàm Binary_Search
Cho Left = 0, Right = n-1
Thực hiện trong khi Left <= Right
m=(Left + Right)/2
Nếu a[m] == x thì
dừng ct, trả về kết quả tìm thấy (m)
ngược lại
nếu x > a[m] thì Left = m+1
ngược lại Right = m-1
Kết thúc tìm kiếm trong mảng tìm không
thấy Trả về kết quả tìm không thấy (-1)
Hàm Binary_Search
Cho Left = 0, Right = n-1
Thực hiện trong khi Left <= Right
m=(Left + Right)/2
Nếu a[m] == x thì
dừng ct, trả về kết quả tìm thấy (m)
ngược lại
nếu x > a[m] thì Left = m+1
ngược lại Right = m-1
Kết thúc tìm kiếm trong mảng tìm không
thấy Trả về kết quả tìm không thấy (-1)
int Binary_Search(int x, int a[ ], int n) {
int L = 0, R = n-1; int m;
while (L <= R) {
Trang 173 15 30 23 6 11 53 25 13 8 36 49
1 Selection Sort (Sắp xếp chọn trực tiếp)
Ý Tưởng :
Trang 201 Selection Sort ( Sắp xếp chọn trực tiếp)
và đưa lên đầu nhóm chúng ta còn lại N-1 phần
tử đứng ở phía sau dãy M chưa có thứ tự
Chúng ta tiếp tục chọn phần tử có giá trị nhỏ
nhất trong N-1 phần tử chưa có thứ tự này để
đưa lên đầu nhóm chưa thứ tự này (N-1)
Làm tiếp tục cho đến cuối dãy
Là phương pháp sắp xếp bằng cách chọn phần tử bé nhất xếp vào vị trí thứ nhất, tương tự với các phần tử nhỏ thứ hai, thứ ba,
Trang 21if a[j] < a[min] thì min = j
đổi chỗ a[i] với a[min]
if a[j] < a[min] thì min = j
đổi chỗ a[i] với a[min]
void SelectionSort ( int a[ ], int n) {
} }
Cài đặt chương trình
Trang 222 Sắp xếp chèn trực tiếp (Straight Insertion Sort )
Ý Tưởng :
Trang 242 Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Trang 252 Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Ý Tưởng :
Trang 262 Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Ý Tưởng :
Trang 272 Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Ý Tưởng :
Trang 28} }
void InsertionSort( int a[ ], int n) {
Cài đặt chương trình
Trang 293 Sắp xếp Nổi bọt (Bubble Sort)
Ý Tưởng :
sau) nhỏ hơn phần tử đứng ngay trên (trước) nó thì theo nguyên tắc của bọt khí
phần tử nhẹ sẽ bị “trồi” lên phía trên phần tử nặng (hai phần tử này sẽ được đổi chỗ cho nhau) Kết quả là phần tử nhỏ nhất (nhẹ nhất) sẽ được đưa lên (trồi lên) trên bề mặt (đầu mảng) rất nhanh
lần đi thì tất cả các phần tử trong mảng M sẽ có thứ tự tăng
Trang 303 17
5 13 16
19 23 25
i ++
j 3 5
3 13
3 16
n-1 0
Trang 315 17
13 16 3
19 23 25
i ++
j 5 13
5 16
n-1 0
Trang 32i ++
j 5 17
13 16 3
19 23 25
5 13
5 16 16
n-1 0
Trang 33void 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]); }
}
void BubbleSort( int a[ ], int n)
{ int i, j;
Trang 34 Selection Sort
Trung bình đòi hỏi n 2 /2 so sánh, n bước đổi chỗ
Trường hợp xấu nhất tương tự
Trung bình cần n 2 /4 so sánh, n 2 /8 bước đổi chỗ
Xấu nhất cần gấp đôi các bước so với trường hợp trung bình
Trung bình cần n 2 /2 phép so sánh, n 2 /2 thao tác đổi chỗ
Xấu nhất cũng như vậy
Trang 355 Các phương pháp Sắp xếp khác