堆排序-优化的选择排序
- 这个排序首先要 1构造最大堆(通过自底向上保持最大堆化),2再将获得的最大值与末尾节点互换,3接着保持原数组长度-1的最大堆化(不需要再构造最大堆,由于其已经建立了下层满足最大堆化的性质),重复2~3步,直到只剩下一个节点(叶子节点就是最大堆!)需要维护
- 时间复杂度O(nlog2n) 空间复杂度O(1)
- 不稳定的
import java.util.Arrays;
/**
* Created by xiaolong_ma on 2017/4/3.
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr={1,3,2,3,4,5,5,3,2,1};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void maxHeapify(int[] array, int start, int end) {
if (start == end) {
return;
}
int max = start;
int left = start * 2 + 1;
int right = start * 2 + 2;
if (left <= end && array[left] > array[max]) {
max = left;
}
if (right <= end && array[right] > array[max]) {
max = right;
}
if(max!=start){
swapArray(array,max,start);
maxHeapify(array,max,end);
}
}
public static void swapArray(int[] array, int m, int n) {
int v0 = array[m];
array[m] = array[n];
array[n] = v0;
}
public static void buildMaxHeap(int[] array){
for (int i=array.length/2-1;i>=0;i--)
maxHeapify(array,i,array.length-1);
}
public static void heapSort(int[] array) {
buildMaxHeap(array);
int length=array.length-1;
while (length>0){
swapArray(array,0,length);
length--;
maxHeapify(array,0,length);
}
}
}