BÁO CÁO SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT

68 660 0
BÁO CÁO SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT

Đ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

1. Nguyeãn Thò Hoàng Nhi 1. Nguyeãn Thò Hoàng Nhi MSSV:K30-101-066 2. Traàn Minh Phöông 2. Traàn Minh Phöông MSSV:K30-101-074 MSSV:K30-101-074 LP:3/B SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Một danh sách có thứ tự (danh sách được sắp) là một danh sách Một danh sách có thứ tự (danh sách được sắp) là một danh sách mà các phần tử của nó được sắp xếp theo một thứ tự nào đó dựa mà các phần tử của nó được sắp xếp theo một thứ tự nào đó dựa trên một trường khoá. trên một trường khoá.  Ví dụ Ví dụ : : Danh sách các phần tử số có thứ tự tăng là danh sách mà với mọi Danh sách các phần tử số có thứ tự tăng là danh sách mà với mọi cặp phần tử X, Y ta luôn có X < = Y nếu X xuất hiện trước Y trong cặp phần tử X, Y ta luôn có X < = Y nếu X xuất hiện trước Y trong danh sách. danh sách.  Chú ý Chú ý : danh sách có 1 hoặc không có phần tử nào được xem là : danh sách có 1 hoặc không có phần tử nào được xem là một danh sách được sắp. một danh sách được sắp. SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Các cách tiếp cận:  Phương án 1 (thao tác trên vùng Info) : Hoán vò nội dung các phần tử trong danh sách.  Phương án 2 (thao tác trên vùng Next) : Thay đổi các mối liên kết SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Phương án 1 :  Cài đặt lại trên xâu một trong những thuật toán sắp xếp đã biết trên mảng.  Điểm khác biệt duy nhất là cách thức truy xuất đến các phần tử trên xâu thông qua liên kết thay vì chỉ số như trên mảng.  Do thực hiện hoán vò nội dung của các phần tử nên đòi hỏi sử dụng thêm vùng nhớ trung gian ⇒ chỉ thích hợp với các xâu có các phần tử có thành phần Info kích thước nhỏ.  Khi kích thước của trường Info lớn, việc hoán vò giá trò của hai phân tử sẽ chiếm chi phí đáng kể.  Không tận dụng được các ưu điểm của xâu! THUẬT TOÁN CHỌN THUẬT TOÁN CHỌN TRỰC TIẾP TRÊN XÂU TRỰC TIẾP TRÊN XÂU THAO TAÙC TREÂN VUØNG INFO THAO TAÙC TREÂN VUØNG INFO void ListSelectionSort (LIST &l) { NODE *min; NODE *p, *q; p = l.pHead; while ( p != pTail ) { q = p  pNext; min = p; while ( q != NULL ) { if ( q  Info < min  Info ) min = q; q = q  pNext; } Hoanvi ( min  Info, p  Info); p = p  pNext; } } THAO TÁC TRÊN VÙNG NEXT THAO TÁC TRÊN VÙNG NEXT Phương án 2:  Do các nhược điểm của các phương pháp sắp xếp theo phương án 1, khi dữ liệu lưu tại mỗi phần tử trên xâu có kích thước lớn ta thường dùng một cách tiếp cận khác : + Thay vì hoán đổi giá trò, ta sẽ tìm cách thay đổi trình tự móc nối của các phần tử sao cho tạo lập nên được thứ tự mong muốn ⇒ chỉ thao tác trên các móc nối (pNext). + Kích thước của trường pNext: – Không phụ thuộc vào bản chất dữ liệu lưu trong xâu – Bằng kích thước 1 con trỏ (2 hoặc 4 byte trong môi trường 16 bit, 4 hoặc 8 byte trong môi trường 32 bit…) + Thao tác trên các móc nối thường phức tạp hơn thao tác trực tiếp trên dữ liệu. ⇒ Cần cân nhắc khi chọn cách tiếp cận: Nếu d liệu không quá lớn ữ thì nên chọn phương án 1 hoặc một thuật toán hiệu quả nào đó. THAO TÁC TRÊN VÙNG NEXT THAO TÁC TRÊN VÙNG NEXT  Một trong những cách thay đổi móc nối đơn giản nhất là tạo một danh sách mới là danh sách có thứ tự gồm các phần tử trích từ danh sách cũ. Giả sử danh sách mới sẽ được quản lý bằng con trỏ đầu xâu Result, ta có thuật toán chọn trực tiếp c a phương án 2 như sau:ủ – B1: Khởi tạo danh sách mới Result là rỗng; – B2: Tìm trong danh sách cũ l phần tử nhỏ nhất – min; – B3: Tách min khỏi danh sách cũ; – B4: Chèn min vào cuối danh sách Result; – B5: Lặp lại bước 2 khi chưa hết danh sách cũ; THAO TAC TREN VUỉNG NEXT THAO TAC TREN VUỉNG NEXT Vớ duù : 3 9 7 16 pHead 1 pTail 1 pHead2 pTail2 min 13 pTail2 [...]... được sắp xếp VÍ DU Sắp xếp dãy số sau theo thứ tự tăng dần: 3 5 4 1 9 2 pHead pHead pTail 4 5 2 3 1 9 pHead 4 9 5 3 1 2 X Chọn phần tử đầu tiên làm phần tử cầm canh pHead 4 9 5 1 3 2 X ds1 ds2 Tách danh sách hiện hành thành 2 ds pHead 4 9 5 1 3 2 X ds1 ds2 Tách danh sách hiện hành thành 2 ds pHead 4 9 5 1 3 2 X ds1 ds2 Tách danh sách hiện hành thành 2 ds pHead 4 9 5 1 3 2 X ds1 ds2 Tách danh sách. .. ds2 Tách danh sách hiện hành thành 2 ds pHead 4 9 5 1 3 2 X ds1 ds2 Tách danh sách hiện hành thành 2 ds pHead Vậy ta được DS1 và DS2 như sau 9 2 4 3 1 X 5 ds1 ds2 pHead Sắp xếp DS1 và DS2 theo Quick sort 9 2 3 5 1 X ds1 4 ds2 Nối Ds1 – X – Ds2 và đưa kết quả vào pHead 2 pHead 1 5 3 9 4 Nhận xét: • Quick sort trên DS đơn đơn giản hơn phiên bản của nó trên mảng một chiều • Khi dùng quick sort sắp xếp một... NULL) return; if (ds.pHead == NULL) ds = ds1; else { ds.pTail->pNext = ds1.pHead; ds.pTail = ds1.pTail; } Init(ds1); } SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT void Quicksort_ds(List &ds) { NODE *X, *p; //X là phần tử cầm canh List ds1, ds2; if (ds.pHead == ds.pTail) return; //đã có thứ tự Init(ds1); Init(ds2); X = PickHead(ds); while (ds.pHead != NULL) //tách DS thành DS1, DS2 { p = PickHead(ds); if (p->Info... chi phí một cách không cần thiết do cấu trúc tự nhiên của DS đó void Init(List &l) // Khởi tạo DS { l.pHead = l.pTail = NULL; } rỗng NODE* PickHead(List &l)//Trích phần { NODE *p = NULL; if (l.pHead != NULL) { p = l.pHead; l.pHead = l.pHead->pNext; p->pNext = NULL; if(l.pHead == NULL) l.pTail = NULL; } return p; } tử đầu DS SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT void Noi_2_ds(List &ds, List &ds1) { if... init ( lRes ); // khởi tạo danh sách mới while(l1.pHead != NULL) { minprev = FindMinprev(l1); min = PickAfter(l1, minprev);// Lấy phần tử min AddTail(lRes, min);// Chèn min vào cuối danh sách l2 } l1 = lRes; } THUẬT TOÁN QUICK SORT THUẬT TOÁN QUICK SORT Bước 1: Nếu DS có ít hơn 2 phần tử thì dừng Bước 2: Chọn X là phần tử đầu danh sách làm phần tử cầm canh Loại X ra khỏi danh sách h Bước 3: Tách DS ra...THAO TÁC TRÊN VÙNG NEXT min pTail 1 pHead 1 13 9 7 16 pHead2 3 pTail2 pTail2 THAO TÁC TRÊN VÙNG NEXT min pTail 1 pHead 1 13 9 3 16 7 pHead2 pTail2 pTail2 THAO TÁC TRÊN VÙNG NEXT min pTail 1 pHead 1 13 16 pHead2 3 7 9 pTail2 pTail2 THAO TÁC TRÊN VÙNG NEXT min pTail 1 pTail 1 pHead 1 16 pHead2 3 7 9 13 pTail2 pTail2 THAO TÁC TRÊN VÙNG NEXT pTail 1 pHead 1 pTail2 pHead2 3 7 9 13 16 THAO TÁC TRÊN VÙNG... MERGE SORT THUẬT TOÁN MERGE SORT Bước 1: Nếu DS có ít hơn 2 phần tử thì dừng Bước 2: Phân phối luân phiên DS vào 2 danh sách DS1 và DS2 Bước 3: Nếu DS1!=NULL thì Merge sort (DS1) Bước 4: Nếu DS2!=NULL thì Merge sort (DS2) Bước 5: Trộn DS1 và DS2 đã được sắp xếp lại thì ta có DS đã được sắp xếp ... (LIST &l1) // Tìm phần tử đứng trước min trong danh sách { NODE *min ; // chỉ đến phần tử có giá trò nhỏ nhất trong xâu NODE *p, *q, *minprev; p = l1.pHead; q = p pNext; min = p; minprev = NULL; while (q != NULL) { if (q Info < min Info) { min = q; minprev = p;//chỉ phần tử đứng trước min trong xâu } p = q; q = q pNext; } return minprev; } THAO TÁC TRÊN VÙNG NEXT void ListSelectionSort2 (LIST &l1) . Phöông MSSV:K30-101-074 MSSV:K30-101-074 LP:3/B SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Một danh sách có thứ tự (danh sách được sắp) là một danh sách Một danh sách có thứ tự (danh sách được sắp) . danh sách.  Phương án 2 (thao tác trên vùng Next) : Thay đổi các mối liên kết SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Phương án 1 :  Cài đặt lại trên. được sắp. SẮP XẾP THỨ TỰ TRÊN SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT DANH SÁCH LIÊN KẾT Các cách tiếp cận:  Phương án 1 (thao tác trên vùng Info) : Hoán vò nội dung các phần tử trong danh

Ngày đăng: 04/04/2015, 15:12

Từ khóa liên quan

Mục lục

  • Slide 1

  • Slide 2

  • SẮP XẾP THỨ TỰ TRÊN DANH SÁCH LIÊN KẾT

  • Slide 4

  • Slide 5

  • THUẬT TOÁN CHỌN TRỰC TIẾP TRÊN XÂU

  • THAO TÁC TRÊN VÙNG INFO

  • THAO TÁC TRÊN VÙNG NEXT

  • Slide 9

  • Slide 10

  • Slide 11

  • Slide 12

  • Slide 13

  • Slide 14

  • Slide 15

  • Slide 16

  • Slide 17

  • Slide 18

  • Slide 19

  • Slide 20

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan