《七大排序算法》(五)之堆排序(Java实现)
2017-08-21 15:39
148 查看
堆排序,就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的,等会会讲下改进的效果。堆排序算法是Floyd和Williams在1964年共同发明的,同时,他们也发明了“堆”这样的数据结构。
堆是具有下列性质的完全二叉树:每个节点的值都大于或者等于其左右孩子结点的值,称其为大顶堆。
完全二叉树有一个性质:如果i等于1,则i是二叉树的艮,无双亲;如果i>1,则其双亲是节点i/2(下取整)。那么package HeapSort;
import java.util.Arrays;
public class SimpleHeapSort {
/*
* 构建最大堆
*/
static void heapAdjust(int arr[],int s,int m){
int temp,j;
temp = arr[s];
for(j = 2*s;j<m;j*=2){
if(j<=m && arr[j]>arr[j+1])
++j;
if(arr[j] >=temp)
break;
arr[s] = arr[j];
s = j;
}
arr[s] = temp;
}
static void heapSort(int arr[]){
int i,temp;
for(i = arr.length/2-1;i>=0;i--)
heapAdjust(arr,i,arr.length-1);
for(i = arr.length-1;i>=1;i--){//将堆顶记录和当前未经排序子序列的最后一个记录交换
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr,0,i-1);
}
for(int a : arr)
System.out.print(a+" ");
}
public static void main(String[] args) {
int arr[] = {50,10,90,30,70,40,80,60,20};
heapSort(arr);
}
}
对于有n个结点的二叉树而言,它的i值自然就是小于等于n/2(下取整),也就是下标i与2i跟2i+1是双亲子女关系。
基本算法思想:将待排序的序列构成一个大碓顶。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素最大值),然后将剩下的n-1个序列重新构成一个堆,这样就会得到n个元素中的次小值,这样如此反复执行,便能得到一个有序的序列。
图解算法:
代码:
堆是具有下列性质的完全二叉树:每个节点的值都大于或者等于其左右孩子结点的值,称其为大顶堆。
完全二叉树有一个性质:如果i等于1,则i是二叉树的艮,无双亲;如果i>1,则其双亲是节点i/2(下取整)。那么package HeapSort;
import java.util.Arrays;
public class SimpleHeapSort {
/*
* 构建最大堆
*/
static void heapAdjust(int arr[],int s,int m){
int temp,j;
temp = arr[s];
for(j = 2*s;j<m;j*=2){
if(j<=m && arr[j]>arr[j+1])
++j;
if(arr[j] >=temp)
break;
arr[s] = arr[j];
s = j;
}
arr[s] = temp;
}
static void heapSort(int arr[]){
int i,temp;
for(i = arr.length/2-1;i>=0;i--)
heapAdjust(arr,i,arr.length-1);
for(i = arr.length-1;i>=1;i--){//将堆顶记录和当前未经排序子序列的最后一个记录交换
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapAdjust(arr,0,i-1);
}
for(int a : arr)
System.out.print(a+" ");
}
public static void main(String[] args) {
int arr[] = {50,10,90,30,70,40,80,60,20};
heapSort(arr);
}
}
对于有n个结点的二叉树而言,它的i值自然就是小于等于n/2(下取整),也就是下标i与2i跟2i+1是双亲子女关系。
基本算法思想:将待排序的序列构成一个大碓顶。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素最大值),然后将剩下的n-1个序列重新构成一个堆,这样就会得到n个元素中的次小值,这样如此反复执行,便能得到一个有序的序列。
图解算法:
代码:
相关文章推荐
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 《算法导论的Java实现》 7 堆排序
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 堆排序Java实现
- 堆排序的java实现
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 算法导论堆排序Java实现
- 算法学习之堆排序(java实现)
- 排序算法--选择排序(简单选择排序、堆排序)java实现
- [转载]堆排序(HeapSort) Java实现
- 堆排序及其JAVA实现
- 基本算法-堆排序及其Java实现
- Java实现快速排序、归并排序、堆排序
- 堆排序详解以及java实现
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- java 实现堆排序