Câu 1: Đề 01: cho mảng 50 pt số nguyên, viết phương trình gồm hàm nhập, sắp xếp, tìm pt theo yêu cầu sau: - Sắp xếp theo kiểu chèn tìm các pt âm và in ra vị trí của nó trong mảng Đánh
Trang 1Câu 1:
Đề 01: cho mảng 50 pt số nguyên, viết phương trình gồm hàm nhập, sắp xếp, tìm pt theo yêu cầu sau:
- Sắp xếp theo kiểu chèn tìm các pt âm và in ra vị trí của nó trong mảng
Đánh giá độ phức tạp của thuật toán: nhỏ nhất, lớn nhất.
//Mang 1 chieu toi da 50 pt sap xep chen, tim va tin ra vt phan tu am
//In ra cac vi tri le xong moi sap xep
#include<stdio.h>
#include<conio.h>
void NhapMang(int a[],int &n)
{ printf("Nhap so phan tu cua mang: ");
scanf("%d",&n);
for(int i=0; i<n; i++)
{ printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
}
}
void XuatMang(int a[], int n)
{ printf("Noi dung cua mang la: ");
for(int i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
}
Trang 2//Sap xep chen
void sxchen(int a[],int n)
j ;
}a[j+1]=temp;
}
}
Trang 3TH1: Tot nhat mang da sap xep tang
Nhu vay ta tim ngay duoc vi tri thich hop de chen dau tien ma ko can vao vong lap
i chay tu 1 den n-1 so phep so sanh la n-1
So phep gan: Gmin=2(n-1) (2 phep gan thuat toan ko chay vao vong lap j)
Do phuc tap: O(n)
TH2: Xau nhat Vi tri chen luon la vi tri dau tien cua day da co thu tu
So phep so sanh la: (n-1) + (n-2) + +1 = n(n-1)/2
So phep gan la: Gmax=Gmin+ =2(n-1) + Smin.1=2(n-1) + n(n-1)/2
Do phuc tap: O(n^2)
Trang 4TH1: Tot nhat la mang da co thu tu tang
So phep hoan vi: Hmin=0;
TH2: Xau nhat la mang co thu tu giam
Lan thu nhat duyet khoang n-1 phep so sanh, lan thu 2 duyet khoang n-2 phep so sanh
So phep hoan vi: Hmin=(n-1) + n(n-2) + + 2 +1 =n(n-1)/2
So phep hoan vi trung binh: Htb=n(n-1)/4
Vay do phuc tap cua thuat toan la: O(n^2)
Trong moi truong hop:
So phep so sanh la: S=(n-2)+(n-1)+ +2+1=n(n-1)/2
So phep hoan vi: n-1 lan
Trang 5TH1: TH tot nhat mang da duoc sap xep roi
So phep gan Gmin=2(n-1)
TH2: Mang co thu tu giam dan
So phep gán: Gmax=2[n+ (n-1) + +1]=n(n+1)
So phep gan trung binh: Gtb=n-1 + n(n+1)/2
Do phuc tap: O(n^2)
Trang 6Đề 3: cho 1 mảng số nguyên gồm tối đa 50 pt Viết chương trình trong đó XĐ các hàm có chức năng nhập, sắp xếp, tìm kiếm và in ra kết quả để:
- Nhập mảng
- Sắp xếp mảng theo thuật toán chèn
- Tìm và in ra giá trị và vị trí của pt đầu tiên trong mảng mà chia hết cho 5
Đánh giá độ phức tạp của thuật toán trong các trường hợp tốt nhất, xấu nhất
// Do phuc tap:
TH1: Tot nhat mang da sap xep tang
Nhu vay ta tim ngay duoc vi tri thich hop de chen dau tien ma ko can vao vong lap
i chay tu 1 den n-1 so phep so sanh la n-1
So phep gan: Gmin=2(n-1) (2 phep gan thuat toan ko chay vao vong lap j)
Do phuc tap: O(n)
TH2: Xau nhat Vi tri chen luon la vi tri dau tien cua day da co thu tu
So phep so sanh la: (n-1) + (n-2) + +1 = n(n-1)/2
So phep gan la: Gmax=Gmin+ =2(n-1) + Smin.1=2(n-1) + n(n-1)/2
Do phuc tap: O(n^2)
Trang 7void timptu(matran a,int m,int n,int x)
//tim vitri phan tu co gia tri x
int tongcotchan(matran a,int m,int n)
//tong phan tu o cot chan
int demspt(matran a,int m,int n)
//dem so phan tu chia het cho 3
int sapxepnoibottheohang(matran a,int x,int n)
//sapxep giam dan noi bot hang x
{ int i,j; //hang x -> i=x-1
Trang 8void sapxepchontheohang(matran a,int x,int n)
//sapxep chon theo hang x
{ int i,j,m,temp; //hang x -> i=x-1
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)if(a[x-1][j]<a[x-1][m]) m=j;
void sxchen(matran a,int x,int n)
//sx chen tang dan theo hang x
Trang 10if(q->tail==NULL) q->tail=p;//Trong TH hang doi rong
for(int i=0; i<n; i++)
{ printf("Nhap phan tu thu %d: ", i+1);
scanf("%d", &x);
Trang 11void them(queue &q,int x)
{ if(ktday(q)) cout<<"Hang doi day! \n";
void bot(queue &q)
{ if(ktrong(q)) cout<<"Hang doi rong! \n";
else
Trang 12{ if(q.head==q.tail)
khoitao(q);
elseq.head=q.head+1;
Trang 13Đề 02: ngăn xếp: tạo một ngăn xếp với các công việc: khởi tạo, kiểm tra rỗng,
Trang 14if(StackEmpty(*s)) printf("Ngan xep rong");
for(int i=0; i<n; i++)
{ printf("Nhap phan tu thu %d: ", i);
Trang 15void them(stack &s,int x)
{ if(ktday(s)) cout<<"Stack day";
Trang 16- Tạo 1 danh sách liên kết đơn gồm các pt là số nguyên
- Chèn 1 pt có giá trị = k nhập từ bàn phím vào sau pt có giá trị lớn nhất trong danh sách
- In ra màn hình danh sách sau khi tạo và chèn
//Dslk don gom cac pt la so nguyen Chen vao sau pt co gia tri lon nhat trong danh sach
In ra danh sach sau khi tao va chen
typedef struct node *listnode;
void Insert_Begin(listnode *p, int x)
Trang 18for(int i=0; i<n; i++)
{ printf("Nhap phan tu thu %d: ",i+1);
Trang 19printf("Danh sach cac phan tu la: ");
Trang 20Câu 3:
1 Cây nhị phân tìm kiếm
Đề 01: cho dãy số nguyên: 10 3 11 4 22 7
A, vẽ cây nhị phân
B, viết chương trình thảo mãn những đk sau:
- Tạo cây nhị phân
struct node* left;
struct node* right;
};
typedef struct node* bistree;
Trang 21if(NewNode==NULL) return NewNode;//x chua nhap vao
if(root==NULL) root=NewNode; //cay rong thi nut goc bang NewNode
Trang 22return NewNode;
}
//Duyet cay thu tu truoc
void NLR(bistree root)
//Duyệt cây thứ tự giữa
void LNR(bistree root)
//Duyệt cây thứ tự sau
void LRN(bistree root)
Trang 23//Tinh tong so nut > 10
int bistree_tong10(bistree root)
//Tinh tong gia tri cac phan tu
int bistree_tong(bistree root)
Trang 24}
return 0;
}
//Tim va in ra gia tri cac phan tu lon hon x
//Dem phan tu lon hon x
int demptx(bistree root, int x)
//In ra phan tu lon hon x
void timptx(bistree root, int x)
Trang 25printf("Nhap so nut cua cay: ");
scanf("%d", &n);
for(int i=0; i<n; i++)
{ printf("Nhap nut thu %d: ",i+1);
printf("\nSo nut >10 cua cay: %d", bistree_tong10(root));
printf("\nCac phan tu co gia tri lon hon 10 la: ");
timpt(root);
printf("\nTong gia tri cac phan tu cua cay: %d", bistree_tong(root));
printf("\nNhap phan tu x: "); scanf("%d", &x);
if(demptx(root,x)==0) printf("Khong co phan tu lon hon x");
Trang 26Đề
- Cài đặt câynhị phân tìm kiếm
- Tính số nút và số nút lá của cây, số nhánh của cây
- Tính chiêu cao của cây
//Cay nhi phan Tinh so nut, so nut la Tinh chieu cao cua cay
struct node* left;
struct node* right;
Trang 27}
return root;
}
//Them 1 nut ben trai
bistree addleft(bistree &root, int x)
//Them 1 nut ben phai
bistree addright(bistree &root, int x)
Trang 28//Tinh chieu cao cua cay
int bistree_high(bistree root)
//Tinh so nut cua cay
int bistree_nut(bistree root)
Trang 29if(root->left==NULL && root->right==NULL)
//So nhanh cua cay bang so nut - so nut la
//Duyet cay thu tu truoc
void NLR(bistree root)
for(int i=0; i<n; i++)
{ printf("Nhap nut thu %d: ",i+1);
Trang 30printf("\nChieu cao cua cay la: %d", bistree_high(root));
printf("\nSo nut cua cay la: %d",bistree_nut(root));
printf("\nSo nut la cua cay la: %d",bistree_nutla(root));printf("\nSo nhanh cua cay la: %d",bistree_nut(root)-bistree_nutla(root));
if(T->item>x) return themnode(T->left,x);
else return themnode(T->right,x);
Trang 31if(T->item>x) return xoa_node(T->left,x);
if(T->item<x) return xoa_node(T->right,x);
{ if(T->left==NULL && T->right==NULL) return 1;
if(chieucao(T->left)>chieucao(T->right)) return chieucao(T->left)+1;
else return chieucao(T->right)+1;
}
}
Trang 32//Tìm kiếm
int timkiem(tree &T,int x)
{ if(T!=NULL)
{ if(T->item==x) return 1; //tim thanh cong
else if(T->item <x) return timkiem(T->right,x);//tim ben trai
else if(T->item >x) return timkiem(T->left,x); //tim ben phai
cout<<"So nut cua cay: "<<demnut(T)<<"\n";
cout<<"So la cua cay: "<<demla(T)<<"\n";
cout<<"chieu cao cua cay: "<<chieucao(T)<<"\n";
cout<<"Nhap nut can xoa: ";
cin>>x;
if(xoa_node(T,x)) cout<<"Xoa thanh cong! \n";
else cout<<"Xoa khong thanh cong !\n";
Trang 33cout<<"Duyet cay theo thu tu truoc: \n";
Trang 34*kiểu dữ liệu: 1 chiều, nhiều chiều
*cấu trúc lưu trữ mảng: hình thức lưu trữ kế tiêp
-địa chỉ các phần tử nối tiếp nhau
-các phần tử sắp xếp theo hang
-bộ nhớ cố định
*đặc điểm
-cấu trúc đơn giản , truy cập nhanh
-thiếu mềm dẻo trong phép xóa, chèn
DANH SÁCH:
*khái niệm: danh sách là 1 tập có thứ tự gồm các phần tử cùng kiêu:
- các phần tử biến động
-các phần tử sắp xếp theo thứ tự trước- sau
*Danh sách tuyến tinh: là quan hệ lân cận giữa các phần tử
-hoặc là danh sách rỗng hoặc có dạng( a1,a2, an)
-n là độ dài /kích thước của danh sách
-mỗi phần tử thường là 1 bản ghi bao gồm 1 hoặc nhiều trường (field)
* danh sách con: gồm các phần tử liên tiếp từ a1 đến aj của danh sách
-nếu i =1 gọi là phần tử đầu (prefix)
-nếu j=n gọi là phần tử cuối (postfix)
Trang 35*dãy con: là 1 danh sách được tạo thành bằng cách loại 1 số phần tử từ danh sách
HÀNG ĐỢI
*khái niệm: hang đợi là kiểu danh sách mà thao tác thêm phần tử được thực hiện ở
1 đầu danh sách con fthao tác lấy phần tử ra đươc thực hiện ở đầu kia của danh sách
*nguyên tắc hoạt động: hoạt động theo nguyên tắc FIFO “vào trước – ra trước”
*ví dụ: xếp hang đợi thanh toán ở siêu thị, soát vé ở rạp chiếu phim
NGĂN XẾP
*khái niệm: ngăn xếp à 1 kiểu danh sách mà thao tác thêm và bớt phần tử được
thực hiện chỉ một đầu danh sách gọi là đỉnh
*nguyên tắc hoạt động: theo nguyên tắc LIFO “vào trước – ra sau”
*ví dụ ngăn xếp tủ quần áo, chồng sách, hộp chứa đạn súng trường