您的位置:首页 > 其它

堆排序

2015-11-12 14:17 330 查看
堆积(heap)是树结构的第三种型态堆积是一棵二元树

参考:《算法导论(第3版)》第6章

八大排序算法

代码:

package algorithm;

import java.util.Arrays;

/**
* Created by 刘一波 LiuYibo on 15/11/11.
* E-Mail:zhanlanstar@163.com
*/
public class HeapSortMain {
public static void main(String[] args) {
int[] a = {12, 3, 5, 4, 2, 1, 33, 4, 89, 22, 120, 23, 14};
HeapSort heapSort = new HeapSort();
heapSort.sort(a);
System.out.println(Arrays.toString(a));
}

/**
* 堆排序
* <p/>
* 此排序过程:
* 1. 建大根堆
* 2. 把第一个数字和最后一个交换。且已排序好的个数加1。即,大根堆建好后,第一个是最大的,把它放到最后即可。
* 3. 对于除最后排序好的个数外的数组进行建堆(重复1),交换(重复2),直到结束。
* <p/>
* 这不是完全按照原始算法写的代码,所以可能效率不很高。
*/
static class HeapSort {
/**
* 建堆,建大根堆。
* 一个过程:
* 1. 每一次开始时,i=n/2,i的两个子节点分别是 2*i 和 2*i+1。
* 2. 如果两个子结点的序号在数组内,分别对其进行比较,把最大的放在父结点位置。
* 3. i-- 直到退出。
* 4. 重复1,2,3 直到没有交换,则完成。
*
* @param a      待排序数组
* @param sorted 已经排序好的个数
*/
public void heap(int[] a, int sorted) {
while (true) {
int flag = 0;//交换次数,未交换表明此数组已经符合大根堆条件
for (int i = (a.length - sorted) / 2; i >= 0; i--) {
int x = i * 2;
int y = i * 2 + 1;
System.out.println(i + " " + x + " " + y);
if (y <= (a.length - sorted - 1)) {
if (a[i] < a[y]) {
swap(a, i, y);
flag++;
}
}
if (x <= (a.length - sorted - 1)) {
if (a[i] < a[x]) {
swap(a, i, x);
flag++;
}
}
}
if (flag == 0) {
break;
}
}
}

/**
* 排序
* <p/>
* 1. 大根堆的第一个是最大的,移动到最后,把最后一个放在第一个位置(交换)。
* 2. 把剩余的数调整为大根堆。
* 3. 重复1,2,直到数组排序完成。
*
* @param a
*/
public void sort(int[] a) {
heap(a, 0);
for (int i = 0; i < a.length; i++) {
swap(a, 0, a.length - 1 - i);
heap(a, i + 1);
}
}

public void swap(int[] numbers, int one, int tow) {
int temp = numbers[one];
numbers[one] = numbers[tow];
numbers[tow] = temp;
System.out.println(Arrays.toString(numbers));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: