Tải bản đầy đủ (.doc) (6 trang)

BÁo cáo thực hành cấu trúc dữ liệu docx

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 (304.1 KB, 6 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO:
TH CẤU TRÚC DỮ LIỆU
Thành viên nhóm:
1. Lê Hoàng Long
2. Nguyễn Trường Lưu
Nhóm học phần: 07B
Lớp: 09T4
Đà Nẵng, 04/2011
NỘI DUNG BÁO CÁO
Yêu cầu bài toán:
Đề 1: Viết chuơng trình thực hiện các công việc sau:
1. Sắp xếp mảng tăng dần theo phương pháp chọn trực tiếp
2. Hãy tìm phần tử d theo phương pháp tìm kiếm nhị phân
3. Tìm phần tử lớn nhất trong mảng theo phương pháp đệ qui
Giải quyết yêu cầu:
Mở đầu:
Bài toán đưa ra yêu cầu cần giải quyết trong mảng, do đó, để không mất
tính tổng quát, ta sẽ nhập vào một mảng ngẫu nhiên.
Hàm nhập mảng ngẫu nhiên
void nhap(int n)
{ srand(unsigned) time(0));
for(i=0;i<n;i++)
a[i]=rand()%n +10;
}
Sau khi thực hiện, ta cần phải xuất giá trị của mảng ra màn hình theo hàm
xuất sau:
void xuat()
{


for(i=0;i<N;i++)
{
if(i%5==0) printf("\n%3d\\ ", i/5+1);
printf("%4d", a[i]);
}getch();
}
1. Sắp xếp mảng theo phương pháp chọn trực tiếp
a. Thuật toán
Phương pháp chọn trực tiếp:
• Giải thuật
Ta thấy rằng, nếu mảng có thứ tự, phần tử a
i
luôn là min(a
i
, a
i+1
, ., a
n-1
). Ý tưởng
của thuật toán chọn trực tiếp mô phỏng một trong những cách sắp xếp tự nhiên nhất
trong thực tế: chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về vị
trí đúng là đầu dãy hiện hành; sau đó không quan tâm đến nó nữa, xem dãy hiện hành
chỉ còn N-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho
dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử. Dãy ban đầu có N phần tử,
vậy tóm tắt ý tưởng thuật toán là thực hiện N-1 lượt việc đưa phần tử nhỏ nhất trong
dãy hiện hành về vị trí đúng ở đầu dãy. Các bước tiến hành như sau :
• Bước 1: i = 1;
• Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[N]
• Bước 3 : Hoán vị a[min] và a[i]
• Bước 4 : Nếu i


< N-1 thì i = i+1; Lặp lại Bước 2
Ngược lại: Dừng. //N-1 phần tử đã nằm đúng vị trí.
• Sơ đồ khối
• Cài đặt
Cài đặt thuật toán sắp xếp chọn trực tiếp thành hàm sapxep()
void sapxep() //bang phuong phap chon truc tiep
{ int j,tam,min;
for (i=0;i<N-1;i++)
{min=i;
for(j=i;j<N;j++)
if(a[min]>a[j]){
//hoan vi a[min] va a[i]
tam= a[min];
a[min]=a[j];
a[j]=tam;}}

}
2. Phương pháp tìm kiếm nhị phân
• Giải thuật
Ðối với những dãy số đã có thứ tự (giả sử thứ tự tăng), các phần tử trong dãy có
quan hệ a
i -1
 a
i
 a
i+1
, từ đó kết luận được nếu x > a
i
thì x chỉ có thể xuất hiện trong

đoạn
[a
i+1
,a
N
] của dãy , ngược lại nếu x < a
i
thì x chỉ có thể xuất hiện trong đoạn [a
1
,a
i-1
]
của dãy . Giải thuật tìm nhị phân áp dụng nhận xét trên đây để tìm cách giới hạn
phạm vi tìm kiếm sau mỗi lần so sánh x với một phần tử trong dãy. Ý tưởng của giải
thuật là tại mỗi bước tiến hành so sánh x với phần tử nằm ở vị trí giữa của dãy tìm
kiếm hiện hành, dựa vào kết quả so sánh này để quyết định giới hạn dãy tìm kiếm ở
bước kế tiếp là nửa trên hay nửa dưới của dãy tìm kiếm hiện hành. Giả sử dãy tìm
kiếm hiện hành bao gồm các phần tử a
left
a
right
, các bước tiến hành như sau :
• Bước 1: left = 1; right = N; // tìm kiếm trên tất cả các phần
tử
• Bước 2:
• mid = (left+right)/2; // lấy mốc so sánh
• So sánh a[mid] với x, có 3 khả năng :
o a[mid] = x: Tìm thấy. Dừng
o a[mid] > x: //tìm tiếp x trong dãy con a
left

a
mid -1
:
right =midle - 1;
o a[mid] < x: //tìm tiếp x trong dãy con amid +1 aright :
left = mid + 1;
• Bước 3:
• Nếu left � right //còn phần tử chưa xét � tìm tiếp.
Lặp lại Bước 2.
• Ngược lại: Dừng; //Ðã xét hết tất cả các phần tử.
• Cài đặt
Thuật toán tìm nhị phân có thể được cài đặt thành hàm BinarySearch:
int tim(int d, int dau, int cuoi) // ham tim kiem bang pp nhi phan
{ int giua;
if (d>a[cuoi] ||d<a[dau]) return -1; //neu d ko thuoc mang thi tra ve -1
while(dau<cuoi){ giua= (dau+cuoi)/2; // lay gia tri trung binh
if(d==a[giua]) return giua;
else if(d<a[giua]) cuoi=giua-1 ;
else dau=giua+1;
}
}
4. Tìm phần tử lớn nhất theo phương pháp đệ qui
• Giải thuật:
B1: gán phần tử đầu tiên của mảng là b= a[0]
B2: nếu i++ == N thì return b
Ngược lại: nếu a[i]>max, gán b = a[i]
Return max(b,i);
• Cài đặt:
int max(int b,int i)
{

if(i++==N) return b;
else
{
if(a[i]>b) b=a[i];
return max(b,i);
}
}
Kết quả chạy chương trình:

×