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
Trang 1ĐẠ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
1 Lê Hoàng Long
2 Nguyễn Trường Lưu Nhóm học phần: 07B
Lớp: 09T4
Trang 2Đà 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();
}
Trang 31 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ử ai luôn là min(ai, ai+1, , an-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
Trang 4 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ó
đoạn
[ai+1 ,aN] của dãy , ngược lại nếu x < ai thì x chỉ có thể xuất hiện trong đoạn [a1 ,ai-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ử aleft aright , 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:
Trang 5 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 tiếp x trong dãy con aleft amid -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:
Lặp lại Bước 2
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
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);
int max(int b,int i)
{
if(i++==N) return b;
else
{
Trang 6if(a[i]>b) b=a[i];
return max(b,i);
}
}
Kết quả chạy chương trình: