堆排序
1.堆排序是利用堆这种数据结构而设计的一种算法,堆排序是一种选择排序,它的最坏,最好,平均复杂度均为O(nlogn),它也是不稳定的排序。
2.堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。没有要求结点的左孩子的值和右孩子的值大小关系。
3.每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
![]()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| package sort;
import java.util.Arrays;
public class heapSort { public static void main(String[] args) { }
public static void heapSort(int arr[]) { int temp = 0; System.out.println("堆排序!");
for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); System.out.println(Arrays.toString(arr)); }
for (int j = arr.length - 1; j > 0; j--) { temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); System.out.println("第"+(arr.length-j)+"次沉"+Arrays.toString(arr)); } System.out.println(Arrays.toString(arr));
}
public static void adjustHeap(int arr[], int i, int lenght) { int temp = arr[i]; for (int k = 2 * i + 1; k < lenght; k = 2 * i + 1) { if (k + 1 < lenght && arr[k] < arr[k + 1]) { k++; } if (arr[k] > temp) { arr[i] = arr[k]; i = k; } else { break; } } arr[i] = temp;
} }
|