八大经典排序算法:http://blog.csdn.net/mpk_no1/article/details/76397713
1. 堆排序
平均性能:O(N*logN)。
定义:堆排序是利用堆积树这种结构的一种排序算法,是选择排序的一种。堆分为大根堆和小根堆。大根堆要求每个节点的值都不大于 其父节点的值,由大根堆的要求可知,最大值一定在堆顶。
思想:
1. 将初始序列(R0,R1...,Rn)构建成大顶堆
2. 将堆顶元素R[0]与最后一个元素交换,此时得到新的无序区(R0,R1,Rn-1)
3. 将无序区(R0,R1,Rn-1)构建为新的大根堆,再次将R0与最后一个元素交换,不断重复得到有序序列。
1)构建初始堆
一组记录(5,11,7,2,3,17)利用大顶堆排序方法建立初始堆为?
分析:首先建立完全二叉树。
再从最后一个非叶结点开始调整。
第一次交换7,17的位置。
11不用调整。
最后调整根结点。
此时把5换下去后,以5为根的子树不满足大顶堆的要求,因此再调整。
即最终的初始堆是:17,11,7,2,3,5.
2)得到初始堆后,堆顶元素和最后元素互换,即17和5互换,后得到不符合大根堆,重新变换,从父节点开始得到大根堆
/**
* @Description:堆排序算法实现
* @author MPK
* @time 2017-7-30
*/
public class heap_sort {
public static void heapsort(int[] list) {
if (list == null || list.length == 0) return ;
//建立大顶堆
for (int i = list.length/2-1; i >= 0; i--) {
heapAdjust(list, i, list.length-1);
}
//堆排序
for (int i = list.length - 1; i >= 0; i--) {
int temp = list[0];
list[0] = list[i];
list[i] = temp;
heapAdjust(list, 0, i-1);
}
}
public static void heapAdjust(int[] list, int start, int end) {
int temp = list[start];
//从start结点开始往下进行修正
for (int i = 2*start+1; i <= end; i = 2*i+1) {
//选出左右孩子较大的下标
if (i < end && list[i] < list[i+1]) {
i++;
}
if (temp >= list[i]) {
break;
}
list[start] = list[i];//将子节点上移
start = i;
}
list[start] = temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] list = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
heapsort(list);
for (int i = 0; i < list.length; i++)
System.out.print(list[i] + " ");
}
}