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

lập trình ứng dụng sử dụng các thiuật toán sắp xếp

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 (1.12 MB, 22 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI</b>

<b>KHOA KỸ THUẬT MÁY TÍNH</b>

<b>---o0o---TÊN ĐỀ TÀI</b>

<b>LẬP TRÌNH ỨNG DỤNG SỬ DỤNG CÁC THIUẬT TỐNSẮP XẾP</b>

<b>Giáo viên hướng dẫn: LÊ BÁ VUISinh viên thực hiện: PHAN VIỆT HOÀNG</b>

<i><b> </b></i>

<i><b>Hà Nội, 13 tháng 1 năm 2024.</b></i>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>MỤC LỤC</b>

I. Những vấn đề đã tìm hiểu...3

Thuật tố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 hồn chỉnh...12

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>I.Những vấn đề đã tìm hiểu</b>

Các phần đã tìm hiểu trong quá trình thực hiện sản phẩm:

<b>Thuật toán Insertion Sort</b>

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.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>Thuật toán Selection Sort</b>

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:

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>Thuật toán Bubble Sort</b>

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:

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>Thuật toán Merge Sort</b>

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ệnchia đế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:

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>Thuật toán Quick Sort</b>

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 pivoto 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).

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Cho 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ầntử đá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:

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Hàm part:

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>I.Những công việc đã làm</b>

- 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 tố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.

clock_t beg, en;beg =clock();en =clock();

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

en-- Cho phép người dùng có thể tùy chọn đầu vào: sử dụng file đầu vào hoặc có thể nhập trực tiếp từ bàn phím.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

o Nhập dữ liệu trực tiếp từ bàn phím:

o Nhập dữ liệu từ file:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="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 tốn này

<b>II.Code sản phẩm hồn chỉnh</b>

#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>#define fi first

#define se secondusing namespace std;

int n, a[100010] [, b100010] [, c100010] [, d100010] [, x100010], tmp[100010], tmp1[100010], y[100010], ord;

clock_t beg, en;int option () { n if( >10)return0;

cout<<"Ban co muon in ra cac buoc cua chuong trinh khong?"; cout<<" Y/N\n";

char mode; cin>> mode; mode if( =='Y')return1; return0;

}int order () {

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;

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

void 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]) { a[pos] a pos = [ -1] a pos val[ -1]= ; pos--; }

mode if( == 1) { n if( <=10) {

cout<<"Step: "<< i -1<<" "\n; fr j, , n ( 1 )cout<< a ord [ ]j* <<" "; cout<<" "\n;

} }

else if i ( == n ) {

cout<<"Day so sau khi sap xep:\n"; fr j, , n ( 1 )cout<< a ord [ ]j * <<" "; cout<<" "\n;

} } en =clock();

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

void selection_sort (int mode) { cout<<"Selection sort:\n"; beg =clock();

b[ ]0 =-1e9; fr i, , n ( 1 -1) { pos i, val bint = = [ ]i fr j, i, n ( ) { val bif( > [ ])j { val b= [ ]j pos j=; } }

swap ( [b pos], b[ ])i mode if( == 1) { n if( <=10) {

cout<<"Step: "<< << i " "\n; fr j, , n ( 1 )cout<< b ord [ ]j* <<" "; cout<<" "\n;

} }

else if i ( == n -1) {

cout<<"Day so sau khi sap xep:\n"; fr j, , n ( 1 )cout<< b ord [ ]j* <<" "; cout<<" "\n;

} } en =clock();

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

void bubble_sort (int mode) { cout<<"Bubble_sort: "\n; beg =clock(); c[ ]0 =-1e9; bool ck; cnt int = ; while(true){ cnt++; fr i, , n ( 1 -1) {

if( [ ]c i c i > [+ ]) swap( [ ]c i, c i [+ ]); }

ck =true;

fr i, , n ( 1 -1)if( [ ]c i c i > [ + ]) { ck =false;

break; }

mode if( == n 1)if( <=10) { cout<<"Step: "<< cnt <<" "\n; fr i, , n ( 1 )cout<< c ord [ ]i * <<" "; cout<<" "\n;

}

ck if( ==true) { mode if( == 0) {

cout<<"Day so sau khi sap xep:\n"; fr i, , n ( 1 )cout<< c ord [ ]i* <<" "; cout<<" "\n;

} break; } } en =clock();

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

d[pos] tmp= [pos2]; pos2++; } pos++; }

pos1 mid if( > ) { fr i, pos, r ( ) { d tmp[ ]i = [pos2]; pos2++; }

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

} else{ fr i, pos, r ( ) { d tmp[ ]i = [pos1]; pos1++; } }}

void merge_sort (int int int l, r, mode) { l if( == 1and r == n beg ) =clock(); r l if( <= 1) {

if( [ ]d l d> [ ])r swap( [ ]d r, d[ ])l mode if( == 1) {

cout<<"Doan sap xep tu "<< << l " den "<< << r " "\n; fr i, l, r ( )cout<< d ord [ ]i* <<" ";

cout<<" "\n; }

return; }

mid l r int =(+ ) 2; merge_sort l, mid, mode( ) merge_sort mid , r, mode( + ) Merge l, r( )

mode if( == 1) {

cout<<"Doan sap xep tu "<< << l " den "<< << r " "\n; fr i, l, r ( )cout<< d ord [ ]i* <<" ";

cout<<" "\n; }

mode if( == 0and l == 1and r == n ) { cout<<"Day so sau khi sap xep:\n"; fr i, l, r ( )cout<< d ord [ ]i* <<" "; cout<<" "\n;

}

l if( == 1and r == n ) { en =clock();

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

}}

int part(int st, ed)int{

pivot yint = [ ]st; cnt int = ;

for(int i st i = + ; <= ed i;++) { if( [ ]y i<= pivot cnt) ++; }

pivotIndex st cntint = + ; swap( [y pivotIndex], y[ ])st ; i st, j edint = = ;

while i pivotIndex (< && j pivotIndex > ) { while( [ ]y i<= pivot ) {

i++;

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

}

while( [ ]y j pivot > ) { j--;

}

i pivotIndex if(< && j pivotIndex > ) { swap( [y i++], y[ ])j-- ;

} }

return pivotIndex;}

void quick_sort(int st, ed, mode)int int{

st if( >= ed )return;

st if( == 1and ed == n beg ) =clock(); p part st, edint = ( )

quick_sort st, p , mode( -1 ) quick_sort p , ed, mode( + ) mode if( == 1) {

cout<<"Doan sap xep tu "<< st <<" den "<< ed <<" "\n; fr i, st, ed ( )cout<< y ord [ ]i* <<" ";

cout<<" "\n; }

mode if( == 0and st == 1and ed == n ) { cout<<"Day so sau khi sap xep:\n"; fr i, st, ed ( )cout<< y ord [ ]i* <<" "; cout<<" "\n;

}

st if( == 1and ed == n ) { en =clock();

cout<<"Thoi gian chay cua chuong trinh la: "<<(float)(beg)CLOCKS_PER_SEC<<" s"<<" "\n;

}}void input () {

cout<<"\nVui long chon kieu nhap du lieu:\n"; cout<<"1. Nhap tu ban phim\n";

cout<<"2. Nhap tu file\n"; modeint ;

cin>> mode; mode if( == 1) {

cout<<"Nhap so phan tu cua mang: "; cin>> n;

cout<<"Nhap cac phan tu cua mang: "; fr i, , n ( 1 ) {

cin>> x[ ]i a x[ ]i= [ ]i b x[ ]i = [ ]i c x[ ]i= [ ]i d x[ ]i = [ ]i y x[ ]i = [ ]i } }

mode if( == 2) {

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

cout<<"Nhap ten file :"; string s;

cin>> s; ifstream file_in( )s; n = ;

while file_in ( >> x[ ])n { a[ ]n x= [ ]n; b[ ]n x= [ ]n; c[ ]n x= [ ]n; d[ ]n x= [ ]n; y[ ]n x= [ ]n; n++; } n--; }}int main (){

cout<<"---CHUONG TRINH GIA LAP SAP XEP---\n"; cout<<"Chuong trinh bao gom cac kieu sap xep:\n"; cout<<"1. 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\n"; input();

mode, ynint ; while(true){

cout<<"Chon cach sap xep ban muon thuc hien:\n"; cin>> mode;

mode if( == 1) { ord order= (); fr i, , n a ord( 1 ) [ ]i* ; yn option= (); insertion_sort( )yn; fr i, , n a x( 1 ) [ ]i= [ ]i }

else mode if( == 2) { ord order= (); fr i, , n b ord( 1 ) [ ]i* ; yn option= (); selection_sort( )yn; fr i, , n b x( 1 ) [ ]i= [ ]i }

else mode if( == 3) { ord order= (); fr i, , n c ord( 1 ) [ ]i* ; yn option= (); bubble_sort( )yn; fr i, , n c x( 1 ) [ ]i= [ ]i }

else

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

mode if( ==4){ ord order= (); fr i, , n d ord( 1 ) [ ]i* ; yn option= (); cout<<"Merge sort:\n"; merge_sort , n, yn(1 ) fr i, , n d x( 1 ) [ ]i= [ ]i }

else mode if( ==5){ ord order= (); fr i, , n y ord( 1 ) [ ]i* ; yn option= (); cout<<"Quick sort:\n"; quick_sort , n, yn(1 ) fr i, , n y x( 1 ) [ ]i= [ ]i }

else mode if( ==6){ input(); } else

mode if( == 0)break; cout<<"\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;}

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

- Một số hình ảnh chương trình thực hiện:

</div>

×