voidswap(int *a, int *b) { int temp = *b; *b = *a; *a = temp; }
voidmax_heapify(int arr[], int start, int end) { // 建立父節點指標和子節點指標 int dad = start; int son = dad * 2 + 1; while (son <= end) { // 若子節點指標在範圍內才做比較 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節點大小,選擇最大的 son++; if (arr[dad] > arr[son]) //如果父節點大於子節點代表調整完畢,直接跳出函數 return; else { // 否則交換父子內容再繼續子節點和孫節點比较 swap(&arr[dad], &arr[son]); dad = son; son = dad * 2 + 1; } } }
voidheap_sort(int arr[], int len) { int i; // 初始化,i從最後一個父節點開始調整 for (i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); // 先將第一個元素和已排好元素前一位做交換,再重新調整,直到排序完畢 for (i = len - 1; i > 0; i--) { swap(&arr[0], &arr[i]); max_heapify(arr, 0, i - 1); } }
intmain() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 }; int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); int i; for (i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n"); return0; }
voidmax_heapify(int arr[], int start, int end){ // 建立父節點指標和子節點指標 int dad = start; int son = dad * 2 + 1; while (son <= end) { // 若子節點指標在範圍內才做比較 if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節點大小,選擇最大的 son++; if (arr[dad] > arr[son]) // 如果父節點大於子節點代表調整完畢,直接跳出函數 return; else { // 否則交換父子內容再繼續子節點和孫節點比較 swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } } }
voidheap_sort(int arr[], int len){ // 初始化,i從最後一個父節點開始調整 for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); // 先將第一個元素和已经排好的元素前一位做交換,再從新調整(刚调整的元素之前的元素),直到排序完畢 for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); } }
functionmax_heapify(start, end) { //建立父節點指標和子節點指標 var dad = start; var son = dad * 2 + 1; if (son >= end)//若子節點指標超過範圍直接跳出函數 return; if (son + 1 < end && arr[son] < arr[son + 1])//先比較兩個子節點大小,選擇最大的 son++; if (arr[dad] < arr[son]) {//如果父節點小於子節點時,交換父子內容再繼續子節點和孫節點比較 swap(dad, son); max_heapify(son, end); } }
var len = arr.length; //初始化,i從最後一個父節點開始調整 for (var i = Math.floor(len / 2) - 1; i >= 0; i--) max_heapify(i, len); //先將第一個元素和已排好元素前一位做交換,再從新調整,直到排序完畢 for (var i = len - 1; i > 0; i--) { swap(0, i); max_heapify(0, i); }
funcHeapSort(array []int) { m := len(array) s := m/2 for i := s; i > -1; i-- { heap(array, i, m-1) } for i := m-1; i > 0; i-- { array[i], array[0] = array[0], array[i] heap(array, 0, i-1) } }
funcheap(array []int, i, end int){ l := 2*i+1 if l > end { return } n := l r := 2*i+2 if r <= end && array[r]>array[l]{ n = r } if array[i] > array[n]{ return } array[n], array[i] = array[i], array[n] heap(array, n, end) }
function HeapSort(array) function adjust(l,u) whiletrue j = 2*l # 左子點 if (j>u) # 代表沒有子點 break end if ((j+1) <= u) # 有右子點 if (array[j] < array[j+1]) j += 1#比較左右子點 end end if (array[j] > array[l]) #比較父點跟子點 array[l], array[j]= array[j], array[l] l = j # 有交換 else break# 沒交換跳出迴圈 end end end n = length(array) for i in n:-1:1# 建 max Heap adjust(i,n) end #持續把第一個(最大)的元素最後一個交換 array[n],array[1]=array[1],array[n] for i in n-1:-1:1 adjust(1,i) array[i],array[1]=array[1],array[i] end return array end
fnmax_heapify<T: Ord + Copy>(data: &mut [T], pos: usize, end: usize) { letmut dad = pos; letmut son = dad * 2 + 1; while son <= end { if son < end && data[son] < data[son + 1] { son += 1; } if data[dad] > data[son] { return; } else { data.swap(dad, son); dad = son; son = dad * 2 + 1; } } }