排序算法(六):堆排序
2013-12-27 15:58
127 查看
堆定义:
堆是一种完全二叉树,每个结点都大于等于其子结点的称为大顶堆,每个结点都小于等于其子结点的称为小顶堆。
堆排序定义:
将待排序的序列构造成一个大顶堆,此时堆顶是最大值,将其移到序列最末端后,剩余的序列重新构造一个大顶堆,如此反复直到得到一个有序序列。
时间复杂度:O(nlogn)
实现:
堆是一种完全二叉树,每个结点都大于等于其子结点的称为大顶堆,每个结点都小于等于其子结点的称为小顶堆。
堆排序定义:
将待排序的序列构造成一个大顶堆,此时堆顶是最大值,将其移到序列最末端后,剩余的序列重新构造一个大顶堆,如此反复直到得到一个有序序列。
时间复杂度:O(nlogn)
实现:
public class Heap { public void sort(int[] arr){ int i; for(i=arr.length/2-1;i>=0;i--){ heap(arr,i,arr.length); } System.out.println("the heap ..."); SortUtils.print(arr); for(i=arr.length-1;i>1;i--){ SortUtils.swap(arr,i,0); System.out.print("new arr: "); SortUtils.print(arr); System.out.print("new heap: "); heap(arr, 0, i); SortUtils.print(arr); } } /** * 构造大顶堆 * * @param arr * @param s * @param len */ private void heap(int[] arr,int s,int len){ int tmp=arr[s]; int i; for(i=2*s+1;i<len-1;i=i*2+1){ if(arr[i] <arr[i+1]) i++; if(arr[i]<=tmp) break; arr[s]=arr[i]; s=i; } arr[s]=tmp; } public static void main(String[] args){ int[] arr=SortUtils.getArray(); Heap heap = new Heap(); heap.sort(arr); } }
相关文章推荐
- 排序算法之(7)——堆排序
- 【排序算法】堆排序
- 堆排序与其他排序算法的时间效率比较
- 常见的排序算法五——堆排序
- 排序算法之堆排序(Heap Sort)
- 排序算法 -- 堆排序
- 排序算法(四)--选择排序和堆排序
- 排序算法之堆排序
- 排序算法——堆排序
- 排序算法的C语言实现-堆排序
- 排序算法_堆排序
- 经典排序算法 -----冒泡排序,插入排序,快速排序,归并排序,堆排序
- 排序算法系列-堆排序-快速排序-基数排序-简单选择排序-归并排序
- 排序算法思想——归并排序、堆排序、shell排序
- 【排序算法】堆排序的分析
- 排序算法(五) —— 堆排序
- 排序算法(六)——堆排序
- 排序算法6之堆排序
- 排序算法(2) 堆排序 C++实现
- 排序算法总结(5)--堆排序