昨天刚把这三个排序算法复习了一遍,其中归并排序和快速排序特别的重要,一定要熟练并理解透彻!
以下排序的结果都默认为非递减
1、堆排序(默认大顶堆)
堆排序的思想:首先构建一个完全二叉树,从最大的非叶子结点,如果该结点小于孩子结点,则把该结点与最大的孩子结点交换,使该结点不断的往下沉到合适位置。然后又从第二大的非叶子结点开始,不断循环下去直到根节点,这时候便构造出了大顶堆,最后根结点就是堆中最大的节点。交换根结点(arc[1])与最后一个结点(arc[N--]),再使新的根节点不断往下沉到合适位置,并形成新的大顶堆,又让根结点(arc[1])与最后一个(arc[N--])交换...不断循环至整个数组有序。
看看具体的代码:
public void heapSort(int arc[]){
int N =arc.length-1;
for(int i=N/2;i>=1;i--){ //从最大的非叶子结点开始,构造一个大顶堆
sink(arc,N,i);
}
while(N>=1){
each(arc,1,N--); //交换啊arc[1]与arc[N--],注意是N--而不是N
System.out.println(arc[N+1]); //输出根结点,即堆中最大的结点
sink(arc,N,1); //使新的根结点往下沉到合适