You are on page 1of 19

TRƯỜNG ĐẠI HỌC CẦN THƠ

KHOA CÔNG NGHỆ


Môn học: Phân tích và thiết kế thuật toán

BÁO CÁO


Giảng viên: Nguyễn Thanh Tùng


Sinh viên: Nguyễn Lê Nguyễn MSSV:B1709497
Phan Hoài Thanh B1710335
Huỳnh Ngọc Ánh B1709454
22/6/2020
1. MỤC TIÊU – YÊU CẦU
1.1. Giải thuật và cài đặt thuật toán trên máy tính
- Mục tiêu: Viết chương trình thể hiện các giải thuật sắp xếp sau:
 Selection sort
 Insertion sort
 Bubble sort
 Quick sort
- Yêu cầu:
 Sử dụng lưu đồ để thể hiện các giải thuật sắp xếp trên.
 Sử dụng một ngôn ngữ lập trình cụ thể để viết các chương trình thực hiện các
quá trình sắp xếp trên.
1.2. Thiết kế giải thuật và viết chương trình (đệ quy vét cạn)
- Mục tiêu:
 Viết chương trình gọi hàm đệ quy vét cạn tất cả trường hợp.
(theo đồ án đã chọn)
 Lựa chọn giải pháp phù hợp nhất.
(phụ thuộc vào ràng buộc trong đồ án)
- Yêu cầu:
 Trình bày được giải thuật rõ ràng.
 Chương trình phải viết theo kiểu đệ quy.
2. NỘI DUNG THỰC HIỆN
2.1. Giải thuật và cài đặt thuật toán trên máy tính.
2.1.1. SELECTION SORT
LƯU ĐỒ

i>n-1

LẬP TRÌNH

#include<stdio.h>
#include<conio.h>
typedef int keytype;
typedef float othertype;
typedef struct{
keytype key;
othertype otherfeilds;
}
recordtype;
void swap(recordtype *x, recordtype *y)
{
recordtype temp;
temp = *x;
*x = *y;
*y = temp;
}
void selection_sort(recordtype a[], int n) {
int i,j,lowindex;
keytype lowkey;
for (i=0; i<(n-1); i++) {
lowindex = i; lowkey = a[i].key;
for (j = i+1; j <n; j++)

if (a[j].key < lowkey) {

lowkey = a[j].key; lowindex = j;

swap(&a[i],&a[lowindex]);
}
}
int main(){
int n,i;
recordtype a[100];
printf("Nhap so luong cua day:");
scanf("%d",&n);
printf("\n Day so co %d so ngau nhien la: ",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
selection_sort(a, n) ;
{
printf("\n Day da duoc sap xep theo thu tu tang dan \n");
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
}
KẾT QUẢ

2.1.2. INSERT SORT


LƯU ĐỒ
LẬP TRÌNH
#include<stdio.h>
#include<math.h>
#include<conio.h>
typedef int keytype;
typedef float othertype;
typedef struct{
keytype key;
othertype otherfeilds;
}
recordtype;
void swap(recordtype *x, recordtype *y)
{
recordtype temp;
temp = *x;
*x = *y;
*y = temp;
}
void InsertionSort(recordtype a[], int n)
{ int i,j;
for (int i = 1; i<n; i++)
{
j = i;
while ((j > 0) && (a[j].key < a[j-1].key) )
{
swap(&a[j], &a[j-1]);
j--;
}
}
}

int main()
{
int i,n ;
recordtype a[100];
printf("Nhap so luong phan tu cua day:");
scanf("%d",&n);
printf("\n Day so co %d so ngau nhien la: ",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
InsertionSort(a, n) ;
printf("\n Day da duoc sap xep theo thu tu tang dan \n");
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}

KẾT QUẢ
2.1.3. BUBBLE SORT
- Lưu đồ
BEGIN

i=0

Sai
i>n-2 END

Đúng

j=n-1

Sai
j>=i+1

Đúng
D

a [j] < a [j-1]

Đúng

Swap(a[j],a[j-1])
Sai

j=j-1

i=i+1
Lập trình
#include <stdio.h>
typedef int keytype;
typedef float othertype;
typedef struct{
keytype key;
othertype otherfeilds;
}recordtype;
void swap(recordtype *x, recordtype *y)
{
recordtype temp;
temp = *x;
*x = *y;
*y = temp;
}
void BubbleSort(recordtype a[], int n){
int i, j;
for(i=0; i<=n-2; i++)
{
for (j=n-1; j>= i+1; j--)
{
if (a[j-1].key>a[j].key)
swap(&a[j], &a[j-1]);
}
}
}
int main() {
int i;
int n;
recordtype a[100];
printf("\n Nhap so luong phan tu cua day: ");
scanf("%d", &n);
printf("\n Day co %d so ngau nhien la: ", n);
for (i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
BubbleSort(a,n);
printf("\n Day so duoc da duoc sap xep theo thu tu tang dan : \n\n");
for (i=0; i<n; i++)
{
printf(" %d ", a[i]);
}
}

Kết quả :
2.1.4. Quick sort
#include <iostream>
using namespace std;
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}

/*Ham nay lay phan tu cuoi cung cua mang lam pivot*/
int partition(int arr[], int low, int high)
{
int pivot = arr[high]; // phan tu cuoi cung lam pivot
int i = (low - 1); // khoi tao mot phan tu nho hon

for (int j = low; j <= high - 1; j++)


{
// so sanh phan tu hien tai voi pivot
//neu nho hon thi doi cho
if (arr[j] <= pivot)
{
i++;
swap(&arr[i], &arr[j]);
}
}

swap(&arr[i + 1], &arr[high]);


return (i + 1);
}
void quickSort(int arr[], int low, int high)
{
if (low < high)
{
/* k la phan tu chot pivot cua mang con, arr[p] la mang con ben phai */
int k = partition(arr, low, high);

//Sap xep rieng biet cac mang con


quickSort(arr, low, k - 1);
quickSort(arr, k + 1, high);
}
}

int main()
{
int n, i;
cout<<"Nhap so luong phan tu cua mang : ";
cin>>n;

int arr[n];
for(i = 0; i < n; i++)
{
cout<<"Phan tu thu "<<i+1<<": ";
cin>>arr[i];
}
quickSort(arr, 0, n-1);
cout<<"Mang sau khi duoc sap xep theo thu tu tang dan ";
for (i = 0; i < n; i++)
cout<<" "<<arr[i];

return 0;
}

Kết quả
2.2. Thiết kế giải thuật và viết chương trình (đệ quy vét cạn)
2.2.1.Lưu đồ
2.2.2.Lập trình
#include <stdio.h>
#include <math.h>

int a[100],h[100],n,s;
int d[100][10000],pre[100][10000];

void inp(int a[],int &n,int &s)


{
printf("so phan tu can nhap vao day : ");scanf("%d",&n);
s=0;
for (int i=1;i<=n;i++)
{
printf("nhap phan tu thu %d : ",i);
scanf("%d",&a[i]);
s+=a[i];
}
}

void init()
{
for (int i=1;i<=n;i++)
{
d[i][a[i]]=1;
pre[i][a[i]]=i;
}
}

void solve()
{
for (int i=2;i<=n;i++)
for (int j=0;j<=s;j++)
if (d[i-1][j]==1) d[i][j]=1;
else
if ((j-a[i]>=0) && (d[i-1][j-a[i]]==1))
{
d[i][j]=1;
pre[i][j]=i;
}
}
void truyhoi(int n,int s)
{
if ((n!=0)&&(s!=0))
{
if (pre[n][s]!=0)
{
truyhoi(n-1,s-a[pre[n][s]]);
h[n]=1;
}
else
if (d[n-1][s]=1)
truyhoi(n-1,s);
}
}

void out(int s1)


{
truyhoi(n,s1);
printf("day 1 : ");
for (int i=1;i<=n;i++)
if (h[i]==1)
printf("%d ",a[i]);
printf("\nday 2 : ");
for (int i=1;i<=n;i++)
if (h[i]!=1)
printf("%d ",a[i]);
printf("\nchenh lech nho nhat giua 2 day la : %d. ",s-s1*2);
}

void swap(int &x, int &y)


{
int temp = x;
x = y;
y = temp;
}
void bbs(int a[],int n){

bool haveSwap = false;


for (int i = 1; i < n-1; i++){
// i ph?n t? cu?i cùng dã du?c s?p x?p
haveSwap = false;
for (int j = 1; j < n-i-1; j++){
if (a[j] > a[j+1]){
swap(a[j], a[j+1]);
haveSwap = true; // Ki?m tra l?n l?p này có swap không
}
}
// N?u không có swap nào du?c th?c hi?n => m?ng dã s?p x?p. Không c?n l?p thêm
if(haveSwap == false){
break;
}
}
printf("day sau khi sap xep : ");
for(int i =1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
char commentnext='y';
do
{
inp(a,n,s);
bbs(a,n);
init();
solve();
for (int s1=s/2;s1>0;s1--)
if (d[n][s1]==1)
{
out(s1);
break;
}
printf("\nBan co muon dung chuong trinh khong?\n");
printf("Nhan 'y' de dung hoac mot phim khac de tiep tuc\n");
fflush(stdin);
scanf("%c", &commentnext);
}
while ( (commentnext != 'y') && (commentnext != 'Y') );
return 0;
}

Kết quả :

You might also like