堆排序

 

堆排序使用的是构造大顶堆,然后交换第0个元素和最后一个元素,依次类推完成排序

 1 public class test {
 2     
 3     public static void main(String[] args) {
 4         int[] data5 = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
 5         print(data5);
 6         heapSort(data5);
 7         System.out.println("排序后的数组:");
 8         print(data5);
 9     }
10     
11     public static void createMaxdHeap(int[] data, int lastIndex) {
12         for (int i = (lastIndex-1)/2; i >= 0; i--) {
13             int k = i;
14             while (2*k+1 <= lastIndex) {
15                 int biggerIndex = 2*k+1;
16                 // 比较左子节点和右子节点,去最大值的索引
17                 if (biggerIndex < lastIndex) {
18                     if(data[biggerIndex] < data[biggerIndex+1]) {
19                         biggerIndex++;
20                     }
21                 }
22                 // 如果子节点比它大,则交换索引,并修改k
23                 if (data[k] < data[biggerIndex]) {
24                     swap(data, k, biggerIndex);
25                     k = biggerIndex;
26                 } else { // 否则跳出循环
27                     break;
28                 }
29                     
30             }
31         }
32     }
33     
34     public static void heapSort(int[] data) {
35         for (int i = 0; i < data.length; i++) {
36             // 创建大顶堆
37             createMaxdHeap(data, data.length - 1 - i);
38             // 把最大的元素放在最后一位
39             swap(data, 0, data.length - 1 - i);
40             print(data);
41         }
42     }
43 
44     public static void swap(int[] data, int i, int j) {
45         if (i == j)
46             return;
47         
48         data[i] = data[i] ^ data[j];
49         data[j] = data[i] ^ data[j];
50         data[i] = data[i] ^ data[j];
51     }
52     public static void print(int[] data) {
53         for (int i = 0; i < data.length; i++) {  
54             System.out.print(data[i] + "\t");  
55         }  
56         System.out.println(); 
57     }
58 }

 

 

posted on 2011-10-18 10:40  pokemonzj  阅读(189)  评论(0)    收藏  举报

导航