Sắp Xếp Vun đống – Wikipedia Tiếng Việt
Có thể bạn quan tâm
Sắp xếp vun đống (Heapsort) dựa trên một cấu trúc dữ liệu được gọi là đống nhị phân (binary heap), gọi đơn giản là đống. Trong mục này chỉ nói về đống trong bài toán sắp xếp.
Đống (Heap)
[sửa | sửa mã nguồn]- Mỗi mảng a[1..n] có thể xem như một cây nhị phân gần đầy (có trọng số là các giá trị của mảng), với gốc ở phần tử thứ nhất, con bên trái của đỉnh a[i] là a[2*i] con bên phải là a[2*i+1] (nếu mảng bắt đầu từ 1 còn nếu mảng bắt đầu từ 0 thì hai con là a[2*i+1] và a[2*i+2]) (nếu 2*i<=n hoặc 2*i+1<=n, khi đó các phần tử có chỉ số lớn hơn không có con, do đó là lá) (leaf).
-
- Một cây nhị phân, được gọi là đống cực đại nếu khóa của mọi nút không nhỏ hơn khóa các con của nó. Khi biểu diễn một mảng a[] bởi một cây nhi phân theo thứ tự tự nhiên điều đó nghĩa là a[i]>=a[2*i] và a[i]>=a[2*i+1] với mọi i =1..int(n/2). Ta cũng sẽ gọi mảng như vậy là đống. Như vậy trong đống a[1] (ứng với gốc của cây) là phần tử lớn nhất. Mảng bất kỳ chỉ có một phần tử luôn luôn là một đống.
- Một đống cực tiểu được định nghĩa theo các bất đẳng thức ngược lại: a[i]<=a[2*i] và a[i]<=a[2*i+1]. Phần tử đứng ở gốc cây cực tiểu là phần tử nhỏ nhất.
Vun đống
[sửa | sửa mã nguồn]Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống được gọi là vun đống.
Vun đống tại đỉnh thứ i
[sửa | sửa mã nguồn]Nếu hai cây con gốc và đã là đống thì để cây con gốc i trở thành đống chỉ việc so sánh giá trị với giá trị lớn hơn trong hai giá trị và , nếu nhỏ hơn thì đổi chỗ chúng cho nhau. Nếu đổi chỗ cho , tiếp tục so sánh với con lớn hơn trong hai con của nó cho đên khi hoặc gặp đỉnh lá. (Thủ tục DownHeap trong giả mã dưới đây)
Vun một mảng thành đống
[sửa | sửa mã nguồn]Để vun mảng a[1..n] thành đống ta vun từ dưới lên, bắt đầu từ phần tử a[j]với j =Int(n/2) ngược lên tới a[1]. (Thủ tục MakeHeap trong giả mã dưới đây)
Sắp xếp bằng vun đống
[sửa | sửa mã nguồn] Đổi chỗ (Swap): Sau khi mảng a[1..n] đã là đống, lấy phần tử a[1] trên đỉnh của đống ra khỏi đống đặt vào vị trí cuối cùng n, và chuyển phần tử thứ cuối cùng a[n] lên đỉnh đống thì phần tử a[n] đã được đứng đúng vị trí. Vun lại: Phần còn lại của mảng a[1..n-1] chỉ khác cấu trúc đống ở phần tử a[1]. Vun lại mảng này thành đống với n-1 phần tử. Lặp: Tiếp tục với mảng a[1..n-1]. Quá trình dừng lại khi đống chỉ còn lại một phần tử.Ví dụ
[sửa | sửa mã nguồn]Cho mảng a=(2,5,8,12,45,13,45,78)
Ở đây n = 7. Các phần tử từ a[4] đến a[7] là lá.Vun đống
[sửa | sửa mã nguồn]- Vun cây gốc a[3] ta được mảng a=(2,3,7,6,4,1,5)
- Vun cây gốc a[2] ta được mảng a=(2,6,7,3,4,1,5)
- Vun cây gốc a[1] ta được mảng a=(7,6,5,3,4,1,2)
- Bây giờ a=(7,6,5,3,4,1,2) đã là đống.
Sắp xếp
[sửa | sửa mã nguồn]- Đổi chỗ a[1] với a[7]: a=(2,6,5,3,4,1,7) và vun lại mảng a[1..6] ta được mảng a=(6,4,5,3,2,1,7)
- Đổi chỗ a[1] với a[6]: a=(1,4,5,3,2,6,7) và vun lại mảng a[1..5] ta được mảng a=(5,4,1,3,2,6,7)
- Đổi chỗ a[1] với a[5]: a=(2,4,1,3,5,6,7) và vun lại mảng a[1..4] ta được mảng a=(4,3,1,2,5,6,7)
- Đổi chỗ a[1] với a[4]: a=(2,3,1,4,5,6,7) và vun lại mảng a[1..3] ta được mảng a=(3,2,1,4,5,6,7)
- Đổi chỗ a[1] với a[3]: a=(1,2,3,4,5,6,7) và vun lại mảng a[1..2] ta được mảng a=(2,1,3,4,5,6,7)
- Đổi chỗ a[1] với a[2]:a=(1,2,3,4,5,6,7)
- Mảng còn lại chỉ một phần tử. Quá trình sắp xếp đã xong.
Mã giả bằng ngôn ngữ C có sử dụng câu trúc dữ liệu
[sửa | sửa mã nguồn] #include<stdio.h> #include<conio.h> constintn=10; typedefintkeytype; typedeffloatothertype; typedefstructrecordtype{ keytypekey; othertypeotherfields; }; // khai bao mang a co n phan tu recordtypea[n]; voidSwap(recordtype&x,recordtype&y) { recordtypetemp; temp=x; x=y; y=temp; } voidPushDown(intfirst,intlast) { //while (r <= (last - 1) / 2) if(first==last||first>(last-1)/2)return; if(last==2*first+1){ if(a[first].key>a[last].key) Swap(a[first],a[last]); //first = last; return; }elseif((a[first].key>a[2*first+1].key)&&(a[2*first+1].key<=a[2*first+2].key)) { Swap(a[first],a[2*first+1]); PushDown(2*first+1,last); }elseif((a[first].key>a[2*first+2].key)&&(a[2*first+2].key<a[2*first+1].key)) { Swap(a[first],a[2*first+2]); PushDown(2*first+2,last); } elsereturn;//first = last; } voidHeapSort(void) {inti; for(i=(n-2)/2;i>=0;i--) PushDown(i,n-1); for(i=n-1;i>=2;i--){ Swap(a[0],a[i]); PushDown(0,i-1); } Swap(a[0],a[1]); } voidreadList(recordtypea[]) { for(inti=0;i<n;i++) { printf("Phan tu %d = ",i+1); scanf("%d",&a[i]); } } voidprintList(recordtypea[]) { for(inti=0;i<n;i++) { printf("%d ",a[i]); } } intmain() { printf("Nhap %d phan tu cho danh sach.\n",n); readList(a); printf("Danh sach sau khi duoc nhap: \n"); printList(a); HeapSort(); printf("\nDanh sach sau khi duoc sap xep: \n"); printList(a); getch(); return0; }Ứng dụng
[sửa | sửa mã nguồn]- Ngoài giải thuật sắp xếp vun đống, cấu trúc đống còn được ứng dụng trong nhiều giải thuật khác, khi cần lấy ra nhanh chóng các phần tử lớn nhất (hoặc nhỏ nhất) của một dãy phần tử, chẳng hạn trong hàng đợi có ưu tiên trong đó tiêu chuẩn ưu tiên là có khóa lớn nhất (hoặc nhỏ nhất). Có thể tìm thấy điều đó trong giải thuật tìm bộ mã Huffman cho một bảng tần số của các ký tự.(tacgia)
Xem thêm
[sửa | sửa mã nguồn]- Sắp xếp nổi bọt
- Sắp xếp chọn
- Sắp xếp chèn
- Sắp xếp nhanh
- Sắp xếp trộn
- Mã Huffman
| ||
---|---|---|
Lý thuyết | Độ phức tạp thuật toán | Ký hiệu O lớn | Thứ tự toàn phần | Danh sách | Sắp xếp so sánh | |
Sắp xếp đổi chỗ | Sắp xếp nổi bọt | Sắp xếp cốc tai | Sắp xếp chẵn lẻ | Sắp xếp răng lược | Sắp xếp gnome | Sắp xếp nhanh | |
Sắp xếp chọn | Sắp xếp chọn | Sắp xếp vun đống | |
Sắp xếp chèn | Sắp xếp chèn | Sắp xếp Shell | Sắp xếp bằng cây | Sắp xếp thư viện | Patience sorting | |
Sắp xếp trộn | Sắp xếp trộn | Strand sort | |
Sắp xếp không so sánh | Sắp xếp theo cơ số | Sắp xếp thùng | Sắp xếp đếm | Sắp xếp chuồng bồ câu | Burstsort | Bead sort | |
Các loại khác | Sắp xếp topo | Mạng sắp xếp | Bitonic sorter | Pancake sorting | Bogosort | Stooge sort |
Tham khảo
[sửa | sửa mã nguồn]Từ khóa » Giải Thuật Sắp Xếp Heap Sort
-
[JAVA] HEAP SORT: Thuật Toán Sắp Xếp Vun đống - NIIT - ICT Hà Nội
-
Thuật Toán Sắp Xếp Vun đống (Heap Sort) - DNMTechs
-
Thuật Toán Sắp Xếp Vun đống - Heap Sort Algorithm C/C++
-
Heap Sort - Thuật Toán Sắp Xếp Vun Đống — Giải Thuật Lập Trình
-
Thuật Toán Sắp Xếp Vun đống (Heap Sort) - TEK4
-
Thuật Toán HeapSort - Giới Thiệu Chi Tiết Và Code Ví Dụ Trên Nhiều ...
-
Heap Sort Algorithm | Thuật Toán Sắp Xếp Vun đống @@ - YouTube
-
Sắp Xếp Vun đống - Heap - Viblo
-
Chi Tiết Bài Học Sắp Xếp Heap Sort - Vimentor
-
Thuật Toán Sắp Xếp: HEAP SORT | Thư Viện Hướng Dẫn
-
Thuật Toán Sắp Xếp Sắp Xếp Cây - Heap Sort
-
Heap Sort. (Sắp Xếp Vun đống)