1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

6 547 2

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 431 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 3

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ử 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 6

if(a[i]>b) b=a[i];

return max(b,i);

}

}

Kết quả chạy chương trình:

Ngày đăng: 01/08/2014, 23:20

TỪ KHÓA LIÊN QUAN

w