Trang này sẽ giới thiệu ngắn gọn về thuật toán Heap Sort.
Định nghĩa
Heap sort (Tiếng Anh: Heapsort) là thuật toán sắp xếp sử dụng cấu trúc dữ liệu cây nhị phân dạng heap. Heap sort hoạt động trên mảng.
Quá trình
Bản chất của heap sort là một dạng selection sort dựa trên heap.
Sắp xếp
Trước hết xây dựng một max-heap (đỉnh là phần tử lớn nhất), sau đó lấy phần tử đỉnh của heap làm giá trị lớn nhất, hoán đổi với phần tử ở cuối mảng và duy trì tính chất heap của phần còn lại;
Tiếp tục lấy đỉnh heap làm giá trị lớn thứ hai, hoán đổi với phần tử ở vị trí kế cuối mảng và duy trì tính chất heap của phần còn lại;
Lặp như vậy, sau \(n-1\) lần thao tác, toàn bộ mảng sẽ được sắp xếp.
Xây dựng binary heap trên mảng
Sắp xếp các nút theo thứ tự các tầng từ gốc xuống, lưu trong mảng.
Vì vậy, với nút có chỉ số i trong mảng, chỉ số của nút cha, nút con trái và nút con phải như sau:
voidsift_down(intarr[],intstart,intend){// Tính chỉ số của nút cha và nút conintparent=start;intchild=parent*2+1;while(child<=end){// Chỉ so sánh khi chỉ số nút con còn trong phạm vi// So sánh hai nút con, chọn nút lớn hơnif(child+1<=end&&arr[child]<arr[child+1])child++;// Nếu nút cha lớn hơn hoặc bằng nút con thì đã cân chỉnh xong, thoát hàmif(arr[parent]>=arr[child])return;else{// Nếu không thì hoán đổi cha và con, rồi tiếp tục so sánh từ vị trí conswap(arr[parent],arr[child]);parent=child;child=parent*2+1;}}}voidheap_sort(intarr[],intlen){// Bắt đầu từ cha của nút cuối cùng và sift down để hoàn thành heapifyfor(inti=(len-1-1)/2;i>=0;i--)sift_down(arr,i,len-1);// Hoán đổi phần tử đầu với phần tử cuối vùng chưa sắp, rồi sift_down vùng còn lại, lặp đến khi xongfor(inti=len-1;i>0;i--){swap(arr[0],arr[i]);sift_down(arr,0,i-1);}}
defsift_down(arr,start,end):# Tính chỉ số của nút cha và nút conparent=int(start)child=int(parent*2+1)whilechild<=end:# Chỉ so sánh khi chỉ số nút con còn trong phạm vi# So sánh hai nút con, chọn nút lớn hơnifchild+1<=endandarr[child]<arr[child+1]:child+=1# Nếu nút cha lớn hơn hoặc bằng nút con thì đã cân chỉnh xong, thoát hàmifarr[parent]>=arr[child]:returnelse:# Nếu không thì hoán đổi cha và con, rồi tiếp tục so sánh từ vị trí conarr[parent],arr[child]=arr[child],arr[parent]parent=childchild=int(parent*2+1)defheap_sort(arr,len):# Bắt đầu từ cha của nút cuối cùng và sift down để hoàn thành heapifyi=(len-1-1)/2whilei>=0:sift_down(arr,i,len-1)i-=1# Hoán đổi phần tử đầu với phần tử cuối vùng chưa sắp, rồi sift_down vùng còn lại, lặp đến khi xongi=len-1whilei>0:arr[0],arr[i]=arr[i],arr[0]sift_down(arr,0,i-1)i-=1
Last updated on this page:, Update history Found an error? Want to help improve? Edit this page on GitHub! Contributors to this page:OI-wiki All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply