Interchange Sort - Trình bày: Bắt đầu từ phần tử ở vị trí đầu, tính từ vị trí đoạn chưa được sắp xếp, so sánh với các phần tử còn lại trong danh sách. Trong các cặp so sánh, nếu phần tử ở vị trí đầu lớn hơn phần tử ở vị trí sau thì sẽ hoán vị. Ngược lại, phần tử sau lớn hơn thì không hoán vị. - Ưu điểm: đơn giản, dễ hiểu, dễ sử dụng. Nhược điểm: phải thực hiện hoán vị nhiều lần nên tính hiệu quả chưa cao. Selection Sort - Chọn phần tử nhỏ nhất đưa về vị trí đầu tiên của mảng hiện tại và không cần quan tâm đến nó nữa. Khi đó mảng chỉ còn lại n - 1 phần tử của mảng ban đầu, tiếp tục xét từ phần tử thứ 2 của mảng. Lặp lại cho đến khi dãy hiện tại chỉ còn 1 phần tử. - Ưu điểm: thuật toán đơn giản, dễ thực hiện, số lần hoán vị ít. Nhược điểm: chỉ sử dụng được trong trường hợp mảng có kích thước nhỏ, không nhận biết được dãy đã sắp xếp, chưa ổn định. Insertion Sort - - Bắt đầu từ ptử thứ 2(i=1). Mảng sẽ được chia làm 2 phần, một phần đã được sắp xếp và một phần chưa. Mỗi lần lặp thì 1 phần tử sẽ được lấy từ phần chưa sắp xếp, sau đó đem so sánh với các phần tử trong phần đã được sắp xếp để tìm ra vị trí phù hợp cho nó (lớn hơn phần tử trước nó và nhỏ hơn phần tử sau nó). Ưu điểm: đơn giản, dễ hiểu, ổn định, sẽ tiết kiệm thời gian khi mảng đầu vào hầu như đã được sắp xếp. - Nhược điểm: chỉ sử dụng được trong trường hợp mảng có kích thước nhỏ. BubbleSort - - Bắt đầu xét lần lượt từ 2 phần tử liền kề nhau ở cuối mảng, nếu phần tử bên phải nhỏ hơn phần tử bên trái thì thực hiện hoán vị 2pt này, nếu không thì tiếp tục. Cứ như vậy, các phần tử nhỏ sẽ dần nổi lên về phía đầu mảng và các phần tử lớn hơn thì dần chìm về phía cuối mảng. Khi kết thúc vòng thứ nhất ta sẽ đưa được phần tử nhỏ nhất về đầu dãy, sang vòng thứ 2 thì ta tiếp tục làm như vậy và đưa được phần tử nhỏ thứ 2 về vị trí thứ 2 từ đầu mảng. Tiếp tục lặp lại cho đến khi mảng đang xét chỉ còn 1 phần tử. Ưu điểm: đơn giản, dễ hiểu, dễ nhớ. Nhược điểm: tốn thời gian nhất trong các thuật toán sắp xếp, không hiệu quả đối với các mảng có kích thước lớn. ShakerSort - - Shaker Sort là thuật toán cải tiến của Bubble Sort. Ở lần lặp thứ nhất, bắt đầu xét lần lượt từ 2 phần tử liền kề nhau ở cuối mảng, nếu phần tử bên phải nhỏ hơn phần tử bên trái thì thực hiện hoán vị 2pt này, nếu không thì tiếp tục. Cứ như vậy sẽ đưa được phần tử nhỏ nhất về đầu mảng, sau đó sẽ xét từ đầu mảng về cuối tương tự như vậy để đưa được phần tử lớn nhất về cuối mảng. Sau mỗi lần như vậy sẽ giảm được kích thước mảng, từ đó tiết kiệm thời gian. Ưu điểm: được cải tiến nên tiết kiệm thời gian, có thể nhận diện được mảng đã sắp xếp. Nhược điểm: thể hiện được ưu thế vượt trội đối với các mảng gần như đã được sắp xếp nhưng đối với các mảng lộn xộn thì thời gian chưa thật sự tối ưu hơn so với thuật toán Bubble Sort. Heap Sort - Trước hết cần phải tạo được max heap đứng từ nút cha cuối cùng và xác định nút trái, phải, nút cha cuối cùng. Từ max heap đầu tiên, swap max và node lá cuối cùng ( sau đó bỏ node lá cuối cùng), tiếp tục thực hiện xây max heap nhưng đứng từ root. Lặp lại b2 khi kích thước heap lớn hơn 1. Ưu điểm: tốc độ khá nhanh và không quá phức tạp. Nhược điểm: độ ổn định không cao Quick Sort - Được gọi là thuật toán chia để trị. Chọn ra phần tử chốt. - Đưa các phần tử nhỏ hơn ptử chốt sang mảng bên trái và các ptử lớn hơn ptử chốt sang mảng bên phải. Đệ quy bước 2 với 2 mảng bên trái và phải Ưu điểm: tốc độ rất nhanh. Nhược điểm: Linked List - - - Danh sách liên kết (Linked List) là một dãy các cấu trúc dữ liệu được kết nối với nhau thông qua các liên kết (link). Hiểu một cách đơn giản thì Danh sách liên kết là một cấu trúc dữ liệu bao gồm một nhóm các nút (node) tạo thành một chuỗi. Mỗi nút gồm dữ liệu ở nút đó và tham chiếu đến nút kế tiếp trong chuỗi. Ưu điểm: Không như mảng, phải chỉ định 1 số ô nhớ nhất định ngay khi khởi tạo, dslk chỉ sử dụng bộ nhớ để lưu trữ khi dữ liệu được thêm vào, tiết kiệm được không gian lưu trữ. Có thể lưu các phần tử ở bất cứ đâu trên bộ nhớ chứ ko cần phải lưu vào các ô nhớ liền kề nhau như mảng. Thêm phần tử nhanh, xóa cũng nhanh. Nhược điểm: Tìm kiếm chậm, do phải duyệt qua nhiều node để đến được node cần tìm. Queue (hàng đợi) - - - - - Là CTDL trừu tượng, hoạt động theo nguyên tắc vào trước ra trước(FIFO). Queue mở ở cả hai đầu, một đầu để chèn dữ liệu vào(xếp vào hàng) và đầu kia được dùng để xóa dữ liệu(rời hàng), tức là dữ kiệu được nhập vào đầu tiên sẽ được truy cập đầu tiên. Tương tự như việc xếp hàng trong đời sống hàng ngày. Các hoạt động cơ bản: + enqueue(): thêm phần tử vào hàng đợi. + dequeue(): xóa một phần tử khỏi hàng đợi. Các phương thức cơ bản : + peek(): lấy phần tử ở đầu hàng đợi mà không xóa phần tử này. + isFull(): kiểm tra xem hàng đợi là đầy hay không. + isEmpty(): kiểm tra xem hàng đợi là trống hay không. Ưu điểm: + Cài đặt sử dụng Array: dễ cài đặt. + Cài đặt dử dụng Linked List: Nhược điểm: + Cài đặt sử dụng Array: Không thể thay đổi kích thước, nếu thực hiện một lượng lớn các thao tác thêm xóa trên một Queue thì đôi khi có thể gặp lỗi. + Cài đặt dử dụng Linked List: Stack (ngăn xếp) - - - - Là CTDL trừu tượng, hoạt động theo nguyên tắc vào trước ra sau(LIFO). Ví dụ, có một cái hộp đựng sách, quyển sách nào được đặt vào đầu tiên sẽ được lấy ra sau cùng. Quyển nào được đặt vào sau cùng sẽ được lấy ra đầu tiên vì nó nằm ngay trên bề mặt. Ở đây cái hộp đựng sách được hiểu như là một Stack (Ngăn xếp). Các thao tác cơ bản: + Push: thêm 1 phần tử vào Stack. + Pop: Xóa một phần tử được thêm vào gần nhất và trả về phần tử đó. + Peek hoặc Top: Trả về phần tử ở đỉnh Stack. + isEmpty: Kiểm tra xem Stack là rỗng hay không. Ưu điểm: + Cài đặt sử dụng Array: Dễ cài đặt, tiết kiệm bộ nhớ. + Cài đặt dử dụng Linked List: Có thể dễ dàng tăng hoặc giảm kích thước Stack ở thời điểm runtime. Nhược điểm: + Cài đặt sử dụng Array: Không thể tăng hoặc giảm kích thước Stack ở thời điểm runtime. + Cài đặt dử dụng Linked List: Tốn bộ nhớ. AVL-Tree - - AVL-Tree được tạo ra nhằm đáp ứng nhu cầu CTDL vừa có thể thay đổi dễ, vừa có thể tìm kiếm nhanh. Một số khái niệm cơ bản: + Cây: Là 1 CTDL có 1 ptử đặc biệt đặt tại gốc. Ở mỗi nút trong cây có thể có nhiều nút con và mỗi cây có những mức chiều cao khác nhau. + Nút gốc: là nút đầu tiên ở trong mỗi CTDL cây, mỗi CTDL cây chỉ kiểm soát duy nhất 1 nút gốc. + Nút lá: là nút cuối cùng ở mỗi nhánh, nó ko có bất kỳ nút con nào bên dưới. + Nút trung gian: là những nút kh phải gốc, ko phải lá trong cây. + Chiều cao của cây: là chi phí cao nhất để di chuyển từ nút gốc đến 1 nút lá bất kỳ trong cây cộng thêm 1. + Mức của 1 nút: Là chi phí để di chuyển từ gốc tới nút đó. + Cây n phân(nhánh): là 1 cây mà tại mỗi nút, số nút con tối đa trong đó là n. + Cây nhị phân: là cây mà tại mỗi nút có tối đa 2 nút con. + Cây nhị phân tìm kiếm: là cây nhị phân mà tại mỗi nút, g/trị mà nó nắm giữ luôn luôn lớn hơn tất cả các nút con bên trái và bé hơn tất cả các nút con bên phải. + Cây nhị phân cân bằng hoàn toàn: Là cây nptk mà tại mỗi nút, số nút con ở 2 phía lệch nhau ko quá 1. + Cây nhị phân cân bằng: là cây nptk mà tại mỗi nút, chiều cao của cây con trái và cây con phải ko lệch nhau quá 1. Ưu điểm: Hiệu năng tìm kiếm cao, kể cả các trường hợp khó - Nhược điểm: Khi chèn hoặc xóa phần tử khỏi cây thì cần thêm một thao tác đó là giữ cho cây cân bằng.