多种排序算法的思路和简单代码的实现(二)

选择排序的两种算法,与大家分享思路和代码,希望对你有帮助:

 1     /*
 2      * 直接选择排序: 定义第一个数的下标为最小值的下标,然后后面的数依次与这个下标对应的数进行比较,如果小于这个数字,则进行交换。
 3      * 下一趟继续第一第二个数的下标为最小值的下标,依据上述步骤,则第二个数的下标对应的值为第二小,经过n-1趟完成排序。
 4      */
 5     public static void selectSort(int[] a) {
 6         for (int i = 0; i < a.length - 1; i++) {
 7             int min = i;
 8             for (int j = i + 1; j < a.length; j++) {
 9                 if (a[j] < a[min]) {
10                     int b = a[min];
11                     a[min] = a[j];
12                     a[j] = b;
13 
14                 }
15 
16             }
17 
18         }
19     }
20 
21     /*
22      * 堆排序算法:
23      * 建立一个最大堆,然后把最后一个数和第一个交换,再把除了最后一个之外的剩下的其他节点组成的堆进行调整,使之成为最大堆
24      * 这样子就把最大的数依次从后往前排列,就使得数组升序排列。
25      * 这个堆排序如果还看的不太明白,可以访问这个网址,http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621/我看了好多,这一个比较明白,希望对你也有帮助。
26      */
27     // 调整堆函数adjustHeap(),对堆进行调整,使得它成为最大堆。
28     public static void adjustHeap(int[] a, int i, int length) {
29         int lchild = 2 * i + 1; // 左孩子节点序号 ,注意:数组的序号是从0——(n-1)。
30         int rchild = 2 * i + 2; // 右孩子节点序号
31         int max = i; // 最大节点序号
32         if (i <= length / 2) {
33             if (lchild < length + 1 && a[lchild] > a[max])
34                 max = lchild;
35             if (rchild < length + 1 && a[rchild] > a[max])
36                 max = rchild;
37             if (max != i) {
38                 // 交换两个数的位置
39                 int b = a[i];
40                 a[i] = a[max];
41                 a[max] = b;
42                 adjustHeap(a, max, length);// 避免堆调整之后以max为父节点的子树不是堆
43             }
44 
45         }
46 
47     }
48 
49     // 构建堆,非叶节点序号为a.length/2,
50     public static void buildHeap(int[] a) {
51         for (int i = a.length / 2 - 1; i >= 0; i--) {
52             adjustHeap(a, i, a.length - 1);
53 
54         }
55     }
56 
57     // 堆排序,每一趟都都把最后一个节点和第一个节点进行交换,然后把剩下节点组成 的堆进行调整
58     public static void heapSort(int[] a) {
59         buildHeap(a);
60         for (int i = a.length - 1; i >= 1; i--) {
61 
62             int b = a[0];  //交换第一个和最后一个
63             a[0] = a[i];
64             a[i] = b;
65 
66             adjustHeap(a, 0, i - 1);  //调整堆,使得堆节点成最大堆
67 
68         }
69 
70     }

 

posted @ 2017-07-15 21:27  IS+  阅读(208)  评论(0)    收藏  举报