多种排序算法的思路和简单代码的实现(二)
选择排序的两种算法,与大家分享思路和代码,希望对你有帮助:
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 }

浙公网安备 33010602011771号