非递归实现堆排序
来源:互联网 发布:stm8l软件复位 编辑:程序博客网 时间:2024/05/05 14:15
话不多说,直接上例子,首先得明白具体过程:
45 28 49 16 37 82 56 75(最小堆)
建树
45
28 49
16 37 82 56
75
从n/2个节点开始选择,第一趟,16比75小,不换.到n/2-1个节点,49和82、56比,49小,也不换.到n/2-2个结点,28和16、37比,16小,变成
(n/2的意思也就是第一个非叶子节点)
45
16 49
28 37 82 56
75
45和16、49比,16最小,换 变成:
16
45 49
28 37 82 56
75
45和28、37比,28最小 变成:
16
28 49
45 37 82 56
75
最小初始堆建好了。
然后将16和75交换。
75
28 49
45 37 82 56
//16
将剩下的元素建成堆 ,然后再把堆顶的元素放到最后一个,如此循环下去就能得到一个排好序的序列。
下面是代码:
public void heapSort(int[] arr){//大堆顶!for(int i=0;i<arr.length;i++){ heapInit(arr,i); //逐个检查是否比自己的父节点大,大的话就交换,这和 //前面说的第一个非叶子节点开始检查一样} //这里完了代表 初始堆建立好了for (int i=arr.length-1;i>0;i--){ swap(arr,i,0); //和大碓顶交换 heapReBuild(arr,0,i); //然后将0-i-1的元素从新组织成大堆}}public void swap(int[] arr,int i,int j){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp;}public void heapInit(int[] arr,int i){ int parent=0; while(i!=0){ parent=(i-1)/2; if(arr[parent]<arr[i]){ swap(arr,parent,i); i=parent; }else { break; } }}public void heapReBuild(int[] arr,int i,int size){ //从交换和的根节点出发,寻找左右儿子中大的那个 然后和它交换,然后再找,注意left要小于size不等于 int left=2*i+1; int right=2*i+2; int largest=i; while (left<size){ if(arr[left]>arr[i]){ largest=left; } if(right<size&&arr[right]>arr[largest]){ largest=right; } if (largest!=i){ swap(arr,largest,i); }else { break; } i=largest; left=i*2+1; right=2*i+2; }}
1 0
- 非递归实现堆排序
- 堆与堆排序--递归与非递归java实现
- 堆排序的非递归实现
- 堆排序的递归实现以及非递归实现
- 堆排序的递归和非递归实现(C++版)
- 堆排序(非递归)
- 堆排序(非递归)
- 堆排序非递归算法
- 快速排序、冒泡排序、堆排序、shell排序的递归和非递归实现
- 算法导论:堆排序非递归实现(c语言)
- 堆排序(非递归版)-- c语言实现
- 堆排序的非递归算法
- 堆排序的实现(递归)
- 非递归实现合并排序
- 快速排序非递归实现
- 快速排序非递归实现
- 非递归实现归并排序
- 快速排序非递归实现
- JAVA中使用FTPClient工具类上传下载
- CXF Web Service简单应用
- 【 LightOJ 1078 Integer Divisibility + 同余定理 】
- 返回上一页
- Gson的使用
- 非递归实现堆排序
- spring 的自动装配
- 剑指offer--面试题40:数组中只出现一次的数字
- Protobuf 3.0.0 下载地址
- Java代码添加背景音乐
- 收集的一些GIS数据网站
- 说说json和jsonp
- POJ 1284 原根(欧拉函数)
- 程序猿的编程语录