新人求助:关于堆排序的问题(Java)? 400 报错
请问下面这个堆排序算法的逻辑哪个部分出错了,部分参考了<<数据结构与算法分析>>(c语言描述),调试了很久还是没能得出正确的排序,麻烦有时间的朋友帮我看看,感激不尽:)
public class MyHeapSort { /*筛选 * data:待排数组 * k: 需要调整的节点 * heapSize:数组大小 */ static void heapOne(int[] data, int k, int heapSize){ int parent = k; int leftChild = 2 * parent +1; int minChild; //将需要调整的节点暂存起来 int temp = data[k]; while(leftChild < heapSize){ minChild = leftChild; //选出最小子节点 if((leftChild != (heapSize -1)) && data[leftChild+1] < data[leftChild]) minChild ++; //交换 if(data[parent] > data[minChild]){ data[parent] = data[minChild]; parent = minChild; leftChild = 2 * parent +1; }else{ break; } } data[parent] = temp; } static void heapSort(int[] data){ //建立堆 int n = data.length; for(int i = data.length / 2 -1 ; i >= 0; i--) heapOne(data, i, n); while(n>0){ System.out.print(data[0] + " "); // 输出堆顶元素 data[0] = data[n-1]; // 最后一个元素移动到堆顶 n--; heapOne(data,0,n); } } public static void main(String[] args) { int[] a = {1,2,7,6,3,98,5,4}; heapSort(a); } }
public static void swap(int[] data,int i,int j){ int temp = data[i]; data[i] = data[j]; data[j] = temp; } static void heapOne(int[] data, int k, int heapSize){ int parent = k; int leftChild = 2 * parent +1; int minChild; while(leftChild <= heapSize){ minChild = leftChild; //选出最小子节点 if(leftChild <heapSize) if(data[minChild+1] < data[minChild]) minChild ++; //交换 if(data[parent] > data[minChild]){ swap(data,parent,minChild); parent = minChild; leftChild = 2 * parent +1; }else{ break; } } } static void heapSort(int[] data){ //建立堆 int n = data.length-1; while(n>0){ for(int i = (n-1) / 2 ; i >= 0; i--){ heapOne(data, i, n); } swap(data,0,n); n--; }
}
根据你的思路改的。
public static void swap(int[] data,int i,int j){ int temp = data[i]; data[i] = data[j]; data[j] = temp; } static void heapOne(int[] data, int k, int heapSize){ int parent = k; int leftChild = 2 * parent +1; int minChild; while(leftChild <= heapSize){ minChild = leftChild; //选出最小子节点 if(leftChild <heapSize) if(data[minChild+1] < data[minChild]) minChild ++; //交换 if(data[parent] > data[minChild]){ swap(data,parent,minChild); parent = minChild; leftChild = 2 * parent +1; }else{ break; } } } static void heapSort(int[] data){ //建立堆 int n = data.length-1; while(n>0){ for(int i = (n-1) / 2 ; i >= 0; i--){ heapOne(data, i, n); } swap(data,0,n); n--; }
}
根据你的思路改的。
非常感谢你,根据你给出的修改方案,我找到了原来程序的问题所在,原来只需要将:
//交换data[parent] > data[minChild] 改为:temp > data[minChild]即可。
其中,temp 存储了最原先那个需要调整的节点的值。
原来程序不采用swap()的原因是可以尽可能减少交换的次数,通过下标的移动确定出最后需要交换的两个节点,这样就只需要交换一次即可达到目的。
Thank you :)版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。