非递归实现堆排序
2016-09-27 18:28
148 查看
话不多说,直接上例子,首先得明白具体过程:
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
将剩下的元素建成堆 ,然后再把堆顶的元素放到最后一个,如此循环下去就能得到一个排好序的序列。
下面是代码:
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; } }
相关文章推荐
- 非递归方法的堆排序实现
- 大顶堆第二弹----堆排序(递归实现)
- 堆排序的实现(递归)
- 堆排序的递归和非递归实现(C++版)
- 堆与堆排序--递归与非递归java实现
- 非递归方法的堆排序实现
- 算法导论:堆排序递归实现 (c语言)
- 大顶堆第二弹----堆排序(递归实现)
- 堆排序的非递归实现
- 堆排序-c++实现,节点变动则递归子树调整状态
- 快速排序、冒泡排序、堆排序、shell排序的递归和非递归实现
- java递归实现堆排序
- 关于Oracle中split函数的实现以及函数递归的举例。
- 用VB函数Dir实现递归搜索目录
- 树形目录的递归实现(一)数据库+jsp+javabean
- Xslt中递归的实现
- 递归实现十进制转X进制
- 使用"函数递归"实现的树型菜单 (转)
- fibonacci 递归实现
- SQL Server 2005中的递归实现