堆排序
- 构造一个大顶堆,取堆顶数组(也就是最大值)放到数组尾。
- 将剩下的数字构建一个大顶堆,取堆顶数字(也就是剩下值当中的最大值)放到数字尾。
- 重复以上操作,直到取完堆中的数字,最终得到一个从小到大排列的序列。
public static void heapfy(int arr[], int node, int n)
{
if (node > n / 2 || node < 0)
return;
int lChild = node * 2 + 1;
int rChild = node * 2 + 2;
int max = arr[node];
if (rChild < n && max < arr[rChild])
max = arr[rChild];
if (lChild < n && max < arr[lChild])
max = arr[lChild];
if (max != arr[node])
{
if (rChild < n && max == arr[rChild])
{
arr[rChild] = arr[node];
heapfy(arr, rChild, n);
}
else if (lChild < n && max == arr[lChild])
{
arr[lChild] = arr[node];
heapfy(arr, lChild, n);
}
arr[node] = max;
}
}
public static void heap_sort(int arr[], int n)
{
for (int i = n; i > 0; i--)
{
for (int k = i / 2-1; k >= 0; k--)
{
heapfy(arr, k, i);
}
int temp = arr[0];
arr[0] = arr[i - 1];
arr[i - 1]=temp;
}
}