BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIKHOA KỸ THUẬT MÁY TÍNH---o0o---TÊN ĐỀ TÀILẬP TRÌNH ỨNG DỤNG SỬ DỤNG CÁC THIUẬT TOÁNSẮP XẾPGiáo viên hướng dẫn: LÊ BÁ VUISinh viên thự
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA KỸ THUẬT MÁY TÍNH
-o0o -TÊN ĐỀ TÀI LẬP TRÌNH ỨNG DỤNG SỬ DỤNG CÁC THIUẬT TOÁN
Trang 2MỤC LỤC
I Những vấn đề đã tìm hiểu 3
Thuật toán Insertion Sort 3
Thuật toán Selection Sort 4
Thuật toán Bubble Sort 5
Thuật toán Merge Sort 6
Thuật toán Quick Sort 7
I Những công việc đã làm 10
II Code sản phẩm hoàn chỉnh 12
Trang 3I Những vấn đề đã tìm hiểu
Các phần đã tìm hiểu trong quá trình thực hiện sản phẩm:
Thuật toán Insertion Sort
o Ý tưởng: Xét các phần tử theo thứ tự từ trái qua phải, tại từng vị trí j, sau đó chèn phần tử i vào vị trí giữa a[j] và a[j + 1] với điều kiện a[j] <= a[i] <= a[j + 1] và j <= i.
Trang 4Thuật toán Selection Sort
o Ý tưởng: Xét các phần tử từ trái qua phải, tại từng phần tử đang xét tìm phần tử có giá trị nhỏ nhất phía bên phải nó, nếu phần tử tìm được có giá trị nhỏ hơn nó thì đổi chỗ hai phần tử cho nhau.
o Các bước tiến hành:
Bước 1: Xét phần tử tại vị trí i = 1.
Bước 2: Tìm min (a[j]) với i < j.
Bước 3: Nếu a[i] > a[j] thì đổi chỗ 2 phần tử này.
Bước 4: Tăng i lên 1 đơn vị và lặp lại từ bước 2 cho đến khi i = n.
o Độ phức tạp: O(n^2).
o Code đã thực hiện:
Trang 6Thuật toán Bubble Sort
o Ý tưởng: Lần lượt xét từng phần tử, nếu giá trị của nó lớn hơn giá trị của phần tử sau nó thì đổi chố, sau đó lặp lại cho đến khi dãy được sắp xếp.
o Các bước tiến hành:
Bước 1: Xét từng phần tử từ trái qua phải.
Bước 2: Đổi chỗ hai phần tử cạnh nhau nếu phần tử trước có giá trị lớn hơn phần tử sau.
Bước 3: Lặp lại từ bước 1 cho đến khi không còn phải đổi chỗ lần nào.
o Độ phức tạp: O(n^2).
o Code đã thực hiện:
Trang 7Thuật toán Merge Sort
o Ý tưởng: Sử dụng phưởng pháp chia để trị, chia nhỏ một mảng thành nhiều mảng con cho đến khi mỗi mảng con gồm một phần tử duy nhất, sau đó các mảng con được sắp xếp lại thành mảng kết quả.
o Các bước thực hiện:
Gọi hàm merge_sort với l = 1, r = n.
Chia đôi đoạn và gọi merge_sort cho từng đoạn.
Sau khi có kết quả sử dụng hàm merge để sắp xếp lại các phần
tử trong đoạn l, r.
Vì hàm merge_sort là hàm đề quy nên chương trình sẽ thực hiện chia đến khi mỗi đoạn l, r sẽ có điều kiện r = l, rồi sau đó sắp xếp lại mảng từ những mảng con đó để lấy kết quả cho những đoạn l, r rộng hơn.
o Độ phức tạp: O(nlog(n)).
o Code đã thực hiện:
Hàm Merge_sort:
Hàm merge:
Trang 8Thuật toán Quick Sort
o Ý tưởng: chia mảng thành 2 mảng con với 1 điểm làm pivot trong
đó mảng con bên trái sẽ bao gồm các phần tử nhỏ hơn pivotvà mảng con bên phải sẽ bao gồm các phần tử lớn hơn pivot
o Các bước thực hiện:
Chọn phần tử pivot là phần tử đầu tiên của mảng con Khai báo 2 biến làm con trỏ để duyệt 2 phía của phần tử được đánh dấu (1 biến chay từ đầu dãy đến cuối, 1 biến chay từ trước phần tử được đánh dấu trở về đầu mảng).
Trang 9Cho 2 biến con trỏ chay đến khi tìm được 1 phần tử ở bên trái lớn hơn phần tử đánh dấu và 1 phần tử ở bên phải nhỏ hơn phần
tử đánh dấu thì đổi chỗ 2 phần tử đó.
Sau khi thực hiện xong thì đổi chỗ phần tử kết thúc với phần tử pivot Lúc này ta chia được dãy ban đầu thành 2 dãy con Tiếp tục sắp xếp 2 dãy con này cho đến khi cả dãy được sắp xếp.
o Độ phức tạp:
Độ phức tạp trung bình: O(n*log(n)).
o Code đã thực hiện:
Hàm Quick_sort:
Trang 10Hàm part:
Trang 11I Những công việc đã làm
- Thiết kế giao diện có hướng dẫn thân thiện với người dùng.
- Tìm hiều về 5 thuật toán sắp xếp nêu trên.
- Tính được thời gian thực hiện của từng thuật toán sử dụng hai biến đầu cuối kiểu clock_t, đặt lấy thời gian tại điểm bắt đầu và kết thúc thuật toán
Trang 12o Nhập dữ liệu trực tiếp từ bàn phím:
o Nhập dữ liệu từ file:
Trang 13- Cho phép người dùng có thể lựa chọn thứ tự sắp xếp: theo chiều tăng dần hoặc theo chiều giảm dần.
- Thêm lựa chọn in ra các bước của chương trình để người dùng hiểu rõ hơn về cách sắp xếp của các thuật toán này
II Code sản phẩm hoàn chỉnh
#include <bits/stdc++.h>
#define fr(i, st, ed) for(int i = st; i <= ed; i++)
#define fb(i, ed, st) for(int i = ed; i >= st; i )
#define ll long long
#define pii pair <int, int>
#define pll pair <long long, long long>
cout<<"Chon thu tu sap xep ban muon thuc hien:\n";
cout<<"1 Be den lon\n";
cout<<"2 Lon den be\n";
modeint ;
cin>> mode;
mode if( == 1)return1;
return-1;
Trang 14void insertion_sort (int mode) {
cout<<"Insertion sort:\n";
beg =clock();
a[ ]0 =-1e9;
fr i, , n ( 2 ) {
pos i, val aint = = [ ]i
while( [a pos] a pos < [ -1]) {
void selection_sort (int mode) {
cout<<"Selection sort:\n";
Trang 15cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;
Trang 16void merge_sort (int int int l, r, mode) {
l if( == 1and r == n beg ) =clock();
merge_sort l, mid, mode( )
merge_sort mid , r, mode( + )
mode if( == 0and l == 1and r == n ) {
cout<<"Day so sau khi sap xep:\n";
Trang 17mode if( == 0and st == 1and ed == n ) {
cout<<"Day so sau khi sap xep:\n";
cout<<"\nVui long chon kieu nhap du lieu:\n";
cout<<"1 Nhap tu ban phim\n";
cout<<"2 Nhap tu file\n";
Trang 18cout<<"Nhap ten file :";
cout<<"2 Selection sort\n";
cout<<"3 Bubble sort\n";
cout<<"4 Merge sort\n";
cout<<"5 Quick sort\n";
cout<<"6 Nhap day moi\n";
cout<<"Bam 0 neu ban muon thoat chuong trinh.\n\n"; input();
Trang 19cout<<"\n\n1 Insertion sort\n";
cout<<"2 Selection sort\n";
cout<<"3 Bubble sort\n";
cout<<"4 Merge sort\n";
cout<<"5 Quick sort\n";
cout<<"6 Nhap day moi\n";
cout<<"Bam 0 neu ban muon thoat chuong trinh.\n"; }
return0;
}
Trang 20- Một số hình ảnh chương trình thực hiện: