1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Cấu trúc dữ liệu và giải thuật (Nghề: Lập trình máy tính, Tin ứng dụng - Trình độ CĐ/TC) - Trường Cao đẳng Nghề An Giang

80 12 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 80
Dung lượng 0,96 MB

Nội dung

Mục tiêu của giáo trình Cấu trúc dữ liệu và giải thuật giúp các bạn hiểu được nội dung của: dữ liệu, giải thuật, mối quan hệ giữa cấu trúc dữ liệu và giải thuật; phân tích và xác định được dữ liệu, giải thuật, sự kết hợp của dữ liệu và giải thuật trong một chương trình máy tính. Mời các bạn cùng tham khảo!

ỦY BAN NHÂN DÂN TỈNH AN GIANG TRƯỜNG CAO ĐẲNG NGHỀ AN GIANG GIÁO TRÌNH Cấu trúc liệu giải thuật NGHỀ LẬP TRÌNH MÁY TÍNH & TIN ỨNG DỤNG TRÌNH ĐỘ CAO ĐẲNG NGHỀ & TRUNG CẤP NGHỀ (Ban hành theo Quyết định số: /QĐ-CĐN ngày tháng năm 20 Hiệu trưởng trường Cao đẳng nghề An Giang) Tên tác giả : Trần Thị Kim Ngọc Năm ban hành: 2018 TUYÊN BỐ BẢN QUYỀN Tài liệu thuộc loại sách giáo trình nên nguồn thơng tin đƣợc phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm LỜI GIỚI THIỆU Bài giảng cấu trúc liệu giải thuật đƣợc viết nhằm để giảng dạy cho sinh viên chuyên ngành CNTT trƣờng Cao Đẳng Nghề An giang Bài giảng đƣợc thiết kế theo chƣơng trình mơn học cấu trúc liệu giải thuật Bộ ban hành Bài giảng bao gồm chƣơng, nội dung chƣơng đƣợc trình bày cấu trúc liệu giải thuật đơn giản tin học Trƣớc tiên giảng trình bày cấu trúc liệu nhƣ: mảng, trỏ, cấu trúc, tập tin; cấu trúc liệu nâng cao nhƣ: danh sách, ngăn xếp, hàng đợi số ứng dụng danh sách Sau giảng trình bày tiếp giải thuật xếp tìm kiếm, với phƣơng pháp xếp: xen, chọn, bọt, quick sort tìm kiếm nhƣ: nhị phân Thêm vào đó, cuối chƣơng có tập tƣơng ứng để sinh viên ơn lại lý thuyết tùy vào chƣơng mà có số tập nâng cao để khuyến khích sinh viên tự học nghiên cứu Cuốn tài liệu giảng dạy nhiều thiếu sót hạn chế Rất mong nhận đƣợc ý kiến đóng góp sinh viên bạn đọc để giảng ngày hoàn thiện Chân thành cảm ơn quý Thầy Cô Hội đồng thẩm định trƣờng Cao Đẳng Nghề An Giang để giảng Cấu trúc liệu giải thuật đƣợc hoàn chỉnh An Giang, ngày tháng năm 2018 Tham gia biên soạn Trần Thị Kim Ngọc MỤC LỤC TUYÊN BỐ BẢN QUYỀN LỜI GIỚI THIỆU MỤC LỤC GIÁO TRÌNH MƠN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CHƢƠNG 1: GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT I MỐI LIÊN HỆ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU II ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA GIẢI THUẬT Sự cần thiết phải phân tích giải thuật: Thời gian thực giải thuật: 10 a Thời gian thực chƣơng trình: 10 b Đơn vị đo thời gian thực 11 c Thời gian thực trƣờng hợp xấu nhất: 11 Tỷ suất tăng độ phức tạp giải thuật 11 a Tỷ suất tăng: 11 b Khái niệm độ phức tạp giải thuật 12 Cách tính độ phức tạp: 12 a Qui tắc cộng: 12 b Qui tắc nhân: 13 c Qui tắc tổng qt để phân tích chƣơng trình: 13 d Độ phức tạp chƣơng trình có gọi chƣơng trình khơng đệ quy: 13 Phân tích chƣơng trình đệ quy: 14 a Thành lập phƣơng trình đệ quy: 15 b Giải phƣơng trình đệ quy: 15 III BÀI TẬP 20 CHƢƠNG 2: CÁC KIỂU DỮ LIỆU NÂNG CAO 22 I MẢNG: 22 Mảng chiều: 22 Mảng nhiều chiều: 24 II CON TRỎ: 25 Cấp phát tĩnh, cấp phát động trỏ 25 Sự cài đặt: 26 III CẤU TRÚC: 26 Định nghĩa kiểu cấu trúc: 26 Khai báo biến cấu trúc: 28 IV BÀI TẬP 28 CHƢƠNG 3: DANH SÁCH 30 I KHÁI NIỆM DANH SÁCH 30 Các phép toán danh sách 30 Cài đặt danh sách mảng (danh sách đặc): 32 II CÀI ĐẶT DANH SÁCH BẰNG CON TRỎ (DANH SÁCH LIÊN KẾT) 36 III NGĂN XẾP (STACK) 41 Định nghĩa ngăn xếp 41 Các phép toán ngăn xếp 41 Cài đặt ngăn xếp: 42 IV HÀNG ĐỢI (QUEUE) 45 Định Nghĩa 45 Các phép toán hàng 45 Cài đặt hàng 45 V MỘT SỐ ỨNG DỤNG CỦA DANH SÁCH 53 Đảo ngƣợc xâu ký tự 53 Tính giá trị biểu thức dạng hậu tố 54 Chuyển đổi biểu thức dạng trung tố sang hậu tố 56 VI BÀI TẬP 59 Bài tập bản: 59 Bài tập nâng cao: 60 CHƢƠNG 4: SẮP XẾP VÀ TÌM KIẾM 61 I GIỚI THIỆU VỀ SẮP XẾP VÀ TÌM KIẾM 61 II CÁC PHƢƠNG PHÁP SẮP XẾP 62 Sắp xếp kiểu chọn (Selection Sort) 62 Sắp xếp kiểu chèn (Insertion Sort) 63 Sắp xếp bọt (Bubble Sort) 65 Quick sort 67 a Giới thiệu 67 b Các bƣớc thực giải thuật 67 c Cài đặt giải thuật 68 Heap sort 70 a Giới thiệu 70 b Các bƣớc thực giải thuật 70 III CÁC PHƢƠNG PHÁP TÌM KIẾM 73 Tìm kiếm 73 Tìm kiếm nhị phân 74 Tìm kiếm tam phân 75 IV BÀI TẬP 77 CÁC THUẬT NGỮ CHUYÊN MÔN 78 TÀI LIỆU THAM KHẢO 79 GIÁO TRÌNH MƠN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Tên môn học: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mã môn học: MH 16 Thời gian thực môn học: 60 (Lý thuyết: 20 giờ, thực hành, thí nghiệm, thảo luận: 36 giờ, kiểm tra: giờ) Vị trí, tính chất, ý nghĩa vai trị mơn học: - Vị trí: Thuộc nhóm mơn: Mơn học lý thuyết chun nghành, đƣợc bố trí sau mơn: Tin học bản, Lập trình - Tính chất: Mơn học u cầu phải có tƣ logic kiến thức lập trình -Ý nghĩa vai trị môn học: giúp em tƣ duy, vận động suy nghĩ làm tảng cho môn học sau Mục tiêu môn học: - Về kiến thức  Hiểu đƣợc nội dung của: liệu, giải thuật, mối quan hệ cấu trúc liệu giải thuật  Phân tích xác định đƣợc liệu, giải thuật, kết hợp liệu giải thuật chƣơng trình máy tính  Áp dụng thuật tốn hợp lý cấu trúc liệu tƣơng thích để giải toán đơn giản  Áp dụng đƣợc phƣơng pháp xếp, tìm kiếm đơn giản, cấu trúc liệu động (danh sách liên kết) vào giải toán - Về kỹ năng: Thực hành (cài đặt biên dịch) toán sử dụng cấu trúc giải thuật học - Về lực tự chủ trách nhiệm:  Nghiêm túc học tập thực tốt yêu cầu đƣợc giao  Luôn động não suy nghĩ thƣờng xuyên luyện tập tƣ việc học  Rèn luyện tính cẩn thận, khoa học cơng việc học tập, nghiên cứu CHƢƠNG 1: GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mục tiêu: Nhằm cung cấp kiến thức cấu trúc liệu, giải thuật, kiểu liệu, mơ hình liệu kiến thức thiết kế, phân tích giải thuật nhƣ phƣơng pháp phân tích, thiết kế giải thuật Nội dung chính: I MỐI LIÊN HỆ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU Theo quan điểm phân tích thiết kế hƣớng đối tƣợng, lớp đƣợc xây dựng với số chức đối tƣợng tham gia vào hoạt động chƣơng trình Điểm mạnh hƣớng đối tƣợng tính đóng kín tính sử dụng lại lớp Mỗi phần mềm biên dịch cho ngơn ngữ lập trình chứa nhiều thƣ viện lớp nhƣ Chúng ta thử điểm qua số lớp mà ngƣời lập trình thƣờng hay sử dụng: lớp có nhiệm vụ đọc/ ghi để trao đổi liệu với thiết bị ngoại vi nhƣ đĩa, máy in, bàn phím,…; lớp đồ họa cung cấp chức vẽ, tô màu bản; lớp điều khiển cho phép xử lý việc giao tiếp với ngƣời sử dụng thơng qua bàn phím, chuột, hình; lớp phục vụ giao dịch truyền nhận thông tin qua mạng;…Các lớp cấu trúc liệu mà bàn đến không trƣờng hợp ngoại lệ Có thể chia tất lớp thành hai nhóm chính: - Các lớp dịch vụ - Các lớp có khả lƣu trữ xử lý lƣợng liệu lớn Nhóm thứ hai muốn nói đến lớp cấu trúc liệu Vậy có giống khác lớp cấu trúc liệu lớp khác? - Điểm giống lớp cấu trúc liệu lớp khác: Mỗi lớp phải thực số chức thông qua hành vi đối tƣợng Một xây dựng xong lớp cấu trúc liệu đó, hồn tồn tin tƣởng hồn thành xuất sắc nhiệm vụ mà thiết kế giao phó cho Điều khác biệt so với tài liệu viết cấu trúc liệu theo quan điểm hƣớng thủ tục trƣớc đây: việc xử lý liệu khơng có tính đóng kín tính sử dụng lại Tuy mặt thực thi chƣơng trình nhƣ có khả chạy nhanh hơn, nhƣng chúng bộc lộ nhiều nhƣợc điểm: thời gian phát triển giải thuật chậm gây khó khăn nhiều cho ngƣời lập trình, chƣơng trình thiếu tính sáng, khó sửa lỗi phát triển - Đặc trƣng riêng lớp cấu trúc liệu: Nhiệm vụ lớp cấu trúc liệu nắm giữ liệu cho đáp ứng đƣợc chƣơng trình yêu cầu trả liệu cụ thể mà chƣơng trình cần đến Những thao tác cấu trúc liệu thƣờng là: thêm liệu mới, xóa bỏ liệu có, tìm kiếm, truy xuất Ngoài thao tác liệu bản, cấu trúc liệu khác khác thao tác bổ sung khác Chính điều mà thiết kế giải thuật để giải toán lớn, ngƣời ta lựa chọn cấu trúc liệu thích hợp Chúng ta thử xem xét ví dụ thật đơn giản sau đây: Giả sử cần viết chƣơng trình nhận vào dãy số, in chúng theo thứ tự ngƣợc với thứ tự nhập vào ban đầu Để giải toán này, nghĩ đến việc phải khai báo biến để lƣu giá trị nhập vào nhƣ nào, sau thứ tự in để đáp ứng u cầu tốn, dƣờng nhƣ quên áp dụng nguyên tắc lập trình hƣớng đối tƣợng: phải bận tâm đến việc chi tiết Đây ví dụ vơ đơn giản, nhƣng minh họa cho vai trò cấu trúc liệu Nếu nhớ rằng, việc tổ chức lƣu liệu nhƣ việc chi tiết tỉ mỉ không nên thực vào lúc này, lúc bƣớc đầu hiểu đƣợc vai trò lớp cấu trúc liệu Môn cấu trúc liệu giải thuật giúp hiểu rõ lớp cấu trúc liệu có sẵn phần mềm Hơn nữa, học cách xây dựng lớp cấu trúc liệu từ đơn giản đến phức tạp, nắm đƣợc phƣơng pháp nhƣ kỹ thông qua số nguyên tắc chung Từ đó, ngồi khả hiểu rõ để lựa chọn cách đắn cấu trúc liệu có sẵn, cịn có khả xây dựng lớp cấu trúc liệu phức tạp hơn, tinh tế thích hợp toán mà cần giải Khả thừa kế cấu trúc liệu có sẵn để phát triển thêm tính mong muốn điều đáng lƣu ý Với ví dụ trên, tiếp xúc nhiều với việc lập trình không xa lạ với khái niệm “ngăn xếp” Đây cấu trúc liệu đơn giản nhƣng lại thông dụng, dĩ nhiên có dịp học kỹ Ở muốn mƣợn để minh họa, nhằm giúp cho ngƣời đọc làm quen với phƣơng pháp tiếp cận hồn tồn qn suốt giáo trình Giả sử cấu trúc liệu ngăn xếp đƣợc giao cho nhiệm vụ cất giữ liệu trả có yêu cầu, theo quy định bất di bất dịch liệu đƣa vào sau phải đƣợc lấy trƣớc Bằng cách sử dụng cấu trúc liệu ngăn xếp, chƣơng trình trở nên đơn giản đƣợc trình bày ngơn ngữ giả nhƣ sau: Lặp nhập đủ số mong muốn { Nhập số Cất vào ngăn xếp số vừa nhập } Lặp mà ngăn xếp liệu { Lấy từ ngăn xếp số In số vừa lấy đƣợc } Chúng ta có dịp gặp nhiều tốn phức tạp mà cần sử dụng đến đặc tính ngăn xếp Tính đóng kín lớp giúp cho chƣơng trình vơ sáng Đoạn chƣơng trình khơng cho thấy ngăn xếp làm việc với liệu đƣợc đƣa vào nhƣ nào, nhiệm vụ mà giao phó cho hồn tồn yên tâm điều Bằng cách này, có cấu trúc liệu thích hợp, ngƣời lập trình dễ dàng giải tốn lớn Họ yên tâm tập trung vào điểm mấu chốt để xây dựng, tinh chế giải thuật kiểm lỗi Trên vừa giới thiệu phần cấu trúc liệu nằm nội dung môn học “cấu trúc liệu giải thuật” Vậy giải thuật gì? Đứng quan điểm thiết kế lập trình hƣớng đối tƣợng, hiểu vai trò lớp Vậy có lớp ngƣời ta cần xây dựng kịch cho đối tƣợng hoạt động nhằm giải tốn Chúng ta cần cấu trúc chƣơng trình để tạo kịch đó: việc làm trƣớc, việc làm sau; việc làm tình đặc biệt đó; việc cần làm lặp lại nhiều lần Chúng ta nhắc đến giải thuật quay với khái niệm “lập trình thủ tục” trƣớc Ngồi ra, cần đến giải thuật cần thực cho lớp: xong phần đặc tả phƣơng thức - phƣơng tiện giao tiếp lớp với bên - cần đến khái niệm “lập trình thủ tục” để giải phần thực bên phƣơng thức Đó việc phải xử lý liệu bên chúng nhƣ hồn thành đƣợc chức mà phƣơng thức phải đảm nhiệm Nhƣ vậy, phần giải thuật môn học này, chủ yếu tìm hiểu giải thuật mà phƣơng thức lớp Cấu trúc liệu dùng đến, số giải thuật xếp tìm kiếm, giải thuật ứng dụng minh họa việc sử dụng lớp cấu trúc liệu để giải số tốn II ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA GIẢI THUẬT Sự cần thiết phải phân tích giải thuật: Trong giải toán có số giải thuật khác nhau, vấn đề cần phải đánh giá giải thuật để lựa chọn giải thuật tốt (nhất) Thông thƣờng ta vào tiêu chuẩn sau: a[j+1]=a[j]; j ; } a[j+1]=temp; } } Thuật toán sử dụng vịng lặp Vịng lặp ngồi duyệt khoảng N lần, vịng lặp duyệt trung bình N/4 lần (giả sử duyệt đến nửa gặp vị trí cần chèn) Do đó, độ phức tạp trung bình thuật tốn O(N2/4) = O(N2) Sắp xếp bọt (Bubble Sort) Giải thuật xếp bọt đƣợc thực theo nguyên tắc: Duyệt nhiều lần từ cuối lên đầu dãy, tiến hành đổi chỗ phần tử liên tiếp chúng ngƣợc thứ tự Đến bƣớc đó, khơng có phép đổi chỗ xảy tồn dãy đƣợc Nhƣ vậy, sau lần duyệt đầu tiên, phần tử nhỏ dãy lần lƣợt đƣợc đổi chỗ cho phần tử lớn “nổi” lên đầu dãy Lần duyệt thứ 2, phần tử nhỏ thứ lên vị trí thứ nhì dãy v.v Chu ý rằng, không thiết phải tiến hành tất N lần duyệt, mà tới lần duyệt đó, khơng cịn phép đổi chỗ xảy tức tất phần tử nằm thứ tự toàn dãy đƣợc Với dãy số nhƣ phần trƣớc, bƣớc tiến hành giải thuật xếp bọt dãy nhƣ sau: Bƣớc 1: Tại bƣớc này, duyệt từ cuối dãy lên, lần lƣợt xuất cặp ngƣợc thứ tự (06, 98), (06, 49), (06, 17), (06, 32) Phần tử 06 “nổi” lên đầu dãy 32 17 49 98 25 53 61 32 17 49 98 25 53 61 32 17 49 98 25 53 61 32 17 49 98 25 53 61 32 17 49 98 25 53 61 Bƣớc 2: Duyệt từ cuối dãy lên, lần lƣợt xuất cặp ngƣợc thứ tự (25, 98), (25, 49), (17, 32) Phần tử 17 lên vị trí thứ 65 32 17 49 98 25 53 61 32 17 49 25 98 53 61 32 17 25 49 98 53 61 17 32 25 49 98 53 61 Bƣớc 3: Duyệt từ cuối dãy lên, lần lƣợt xuất cặp ngƣợc thứ tự (53, 98), (25, 32) Phần tử 25 lên vị trí thứ 17 32 25 49 98 53 61 17 32 25 49 53 98 61 17 25 32 49 53 98 61 Bƣớc 4: Duyệt từ cuối dãy lên, xuất cặp ngƣợc thứ tự (61, 98) 17 25 32 49 53 98 61 17 25 32 49 53 61 98 Bƣớc 5: Duyệt từ cuối dãy lên, khơng cịn xuất cặp ngƣợc Toàn dãy đƣợc Thủ tục thực xếp bọt C nhƣ sau: void bubble_sort(){ int i, j; for (int i =0; i < n-1; i++) { for (int j = n-1; j >= i+1; j ) if (a[j] < a[j-1]) swap (a[j], a[j-1]); }} 66 Lần duyệt cần khoảng N-1 phép so sánh đổi chỗ để làm phần tử nhỏ lên đầu Lần duyệt thứ cần khoảng N-2 phép toán, v.v Tổng cộng, số phép so sánh cần thực là: (N-1) + (N-2) + … + + = N(N-1)/2 Nhƣ vậy, độ phức tạp giải thuật xếp bọt O(N2) Quick sort a Giới thiệu Quick sort thuật toán xếp đƣợc phát minh lần đầu C.A.Hoare vào năm 1960 Đây có lẽ thuật tốn đƣợc nghiên cứu nhiều đƣợc sử dụng rộng rãi lớp thuật toán xếp Quick sort thuật toán dễ cài đặt, hiệu hầu hết trƣờng hợp, tiêu tốn tài nguyên so với thuật toán khác Độ phức tạp trung bình giải thuật O(NlogN) Nhƣợc điểm giải thuật phải cài đặt đệ qui (có thể khơng dùng đệ qui, nhiên cài đặt phức tạp nhiều) trƣờng hợp xấu độ phức tạp O(N2) Ngồi ra, cài đặt cho Quick sort phải địi hỏi xác Chỉ cần sai sót nhỏ làm cho chƣơng trình ngừng hoạt động Kể từ Quick sort đời lần đầu tiên, có nhiều nỗ lực nhằm cải tiến thuật toán Tuy nhiên, hầu hết cải tiến không mang lại hiệu nhƣ mong đợi, thân Quick sort thuật toán cần Một cải tiến phần thuật tốn dẫn đến tác dụng ngƣợc lại phần làm cho thuật toán trở nên cân Ý tƣởng Quick sort dựa phƣơng pháp chia để trị Giải thuật chia dãy cần thành phần, sau thực việc xếp cho phần độc lập với Để thực điều này, chọn ngẫu nhiên phần tử dãy làm khóa Trong bƣớc tiếp theo, phần tử nhỏ khoá phải đƣợc xếp vào phía trƣớc khố phần tử lớn đƣợc xếp vào phía sau khố Để có đƣợc phân loại này, phần tử đƣợc so sánh với khố hốn đổi vị trí cho cho khố lớn khóa mà lại nằm trƣớc nhỏ khoá mà lại nằm sau Khi lƣợt hốn đổi thực xong dãy đƣợc chia thành đoạn: đoạn bao gồm phần tử nhỏ khố, đoạn cịn lại bao gồm phần tử lớn khoá Áp dụng kỹ thuật nhƣ cho đoạn tiếp tục làm nhƣ đoạn phần tử Khi tồn dãy đƣợc b Các bƣớc thực giải thuật Để chia dãy thành phần thoả mãn yêu cầu nhƣ trên, ta lấy phần tử dãy làm khoá (chẳng hạn phần tử đầu tiên) Tiến hành duyệt từ bên trái dãy dừng lại gặp phần tử lớn khoá Đồng thời tiến hành duyệt từ bên phải dãy gặp phần tử nhỏ khoá Rõ ràng phần tử nằm vị trí khơng phù hợp chúng cần phải đƣợc đổi chỗ cho Tiếp tục trình biến duyệt gặp nhau, ta chia 67 đƣợc dãy thành nửa: Nửa bên phải khoá bao gồm phần tử lớn khoá nửa bên trái phần tử nhỏ khoá Ta xem xét trình phân đơi dãy số cho phần trƣớc 32 17 49 98 25 53 61 Chọn phần tử dãy, phần tủ 32, làm khoá Quá trình duyệt từ bên trái với biến duyệt i dừng lại 49, phần tử lớn khố Q trình duyệt từ bên phải với biến duyệt j dừng lại 25 phần tử nhỏ khoá Tiến hành đổi chỗ phần tử cho 32 17 Khóa 25 98 i 49 53 61 j Quá trình duyệt tiếp tục Biến duyệt i dừng lại 98, biến duyệt j dừng lại 06 Lại tiến hành đổi vị trí phần tử 98 06 32 17 25 Khóa 98 i j 49 53 61 Tiếp tục trình duyệt Các biến duyệt i j gặp trình duyệt dừng lại 32 17 25 Khóa 98 i j 49 53 61 Nhƣ vậy, dãy đƣợc chia làm nửa Nửa đầu từ phần tử đến phần tử thứ j, bao gồm phần tử nhỏ khoá Nửa sau từ phần tử thứ i đến phần tử cuối, bao gồm phần tử lớn khố Q trình duyệt đổi chỗ đƣợc lặp lại với nửa dãy vừa đƣợc tạo ra, tiếp tục nhƣ dãy đƣợc hoàn toàn c Cài đặt giải thuật Để cài đặt giải thuật, trƣớc hết ta xây dựng thủ tục để phân đoạn dãy Thủ tục thủ tục đệ qui, bao gồm việc chia phân đoạn thành đoạn thỏa mãn yêu cầu trên, sau thực lời gọi đệ qui với đoạn vừa tạo đƣợc Giả sử phân đoạn đƣợc giới hạn tham số left right cho biết số đầu cuối phân đoạn, thủ tục đƣợc cài đặt nhƣ sau: void quick(int left, int right) { int i,j; int x,y; 68 i=left; j=right; x= a[left]; { while(a[i]left) j ; if(i1 ( heap phần tử) : lặp lại bƣớc Ngƣợc lại: dừng 70 o Dựa vào tính chất 3, ta thực giai đoạn cách heap an/2+1, an/2+2,…,an, lần lƣợt thêm vào phần tử an/2, an/2-1,…,a1 ta nhận đƣợc Heap theo mong muốn Nhƣ giải đoạn tƣơng đƣơng với n/2 lần thực bƣớc giai đoạn o Cài đặt o Để cài đặt Heap sort cần xây dựng số thủ tục phụ trợ: Thủ tục hiệu chỉnh dãy al,ar thành heap o Giả sử có al,al+1,…ar, đoạn al+1,…ar, heap ta cần xây dựng al,al+1,…,ar thành heap để làm điều ta lần lƣợt xét quan hệ phần tử với phần tử liên đới dãy a2i a2i+1, vi phạm quan hệ heap đổi chổ với phần tử liên đới thich hợp – việc đổi gây phản ứng dây chuyền Hiệu chỉnh ao, ,an-1 thành heap Cho dãy al,…,ar , theo tính chất ta có dãy an/2+1, an/2+2,…,an heap Ghép thêm phần tử an/2 vào bên trái heap hành hiệu chỉnh lại dãy an/2,an/2+1, ,ar thành heap void Tao_heap(int a[], int Left,int Right, int &gan, int &ss) { int khonglantruyen =0 , max; gan ++; { ss++ ; if( (2*Left) == Right) // co lien doi { max = 2*Left; gan++ ; } ss++; if((2*Left) < Right) // co Leftien doi { ss++; if(a[2*Left - 1] > a[2*Left]) // tim max lien doi { max = 2*Left; gan ++; } else { 71 max = 2*Left+1; gan++; } } ss++; if(a[max -1] > a[Left -1]) // dua phan tu max ve dau { hoanvi(&a[Left -1],&a[max -1]); gan+=3; Left = max; gan++; khonglantruyen =0; gan++; } else { khonglantruyen = 1; gan ++; } ss++;gan++; } while ( (2*Left 1 ; Right , gan++) // ss++ la lan dau tien ss dieu kien, lan sau khong gia tri nua { for(Left = Right/2, gan++ , ss++ ; Left>=1 ; Left , gan++) // Tim phan tu lon nhat ve dau { Tao_heap(a,Left,Right,gan,ss); ss++; // So sanh dieu kien vong lap } hoanvi(&a[0],&a[Right-1]); gan+=3; ss++; // So sanh dieu kien vong lap } } Ví dụ minh họa Cho dãy gồm số nguyên : STT l j a[0] a[1] a[2] a[3] a[4] a[5] 1 9 6 6 6 72 10 11 12 13 14 15 16 17 0 0 0 0 3 2 1 8 6 6 8 6 6 5 6 5 5 5 6 6 6 6 6 6 6 1 1 8 8 8 8 9 9 9 9 9 9 Độ phức tạp Trƣờng hợp tốt : dãy đƣợc xếp sẵn=> độ phức tạp O(1) Trƣờng hợp xấu : O(nlog2n) III CÁC PHƢƠNG PHÁP TÌM KIẾM Tìm kiếm Tìm kiếm phƣơng pháp tìm kiếm đơn giản, lần lƣợt duyệt qua toàn ghi cách Tại bƣớc, khoá ghi đƣợc so sánh với giá trị cần tìm Quá trình tìm kiếm kết thúc tìm thấy ghi có khố thoả mãn duyệt hết danh sách Thủ tục tìm kiếm mảng số nguyên nhƣ sau: int sequential_search(int *a, int x, int n){ int i; for (i=0; i

Ngày đăng: 30/08/2022, 11:16

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN