小根堆排序堆排序求助大佬!!!

/*
不知道怎么回事,就是得不到正确的结果,大根堆的可以
*/
public static void smallHeapCreate(int [] arr){
        for(int i=0;i<arr.length;i++){
            while (arr[i]<arr[(i-1)/2]){
                swap(arr,i,(i-1)/2);
                i=(i-1)/2;
            }
        }
        int size=arr.length;
        swap(arr,0,--size);
        for(int i=0;i<size;i++){
            int index=0;
            int left=1;
            while (size>0){
                int min=left+1 < size && arr[left] <arr[left+1] ? left:left+1;
                min=arr[index]<arr[min]?index:min;
                if(min==index)return;
                swap(arr,min,index);
                index=min;
                left=index*2+1;

            }
            swap(arr,index,--size);
        }

    }
    public static void swap(int [] arr,int i, int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

#堆排序小根堆##笔试题目#
全部评论
```java   public static void descendingSort(int[] arr) {     for (int i = 1; i < arr.length; i++) {       swim(arr, i);     }     int size = arr.length;     swap(arr, 0, --size);     while (size > 0) {       sink(arr, 0, size);       swap(arr, 0, --size);     }   }   private static void swim(int[] arr, int i) {     while (i > 0 && arr[i] < arr[(i - 1) / 2]) {       swap(arr, i, (i - 1) / 2);       i = (i - 1) / 2;     }   }   private static void sink(int[] arr, int i, int n) {     while (2 * i + 1 < n) {       int left = 2 * i + 1;       int min = left;       min = left + 1 < n && arr[left] > arr[left + 1] ? min + 1 : min;       min = arr[i] <= arr[min] ? i : min;       if (min == i) return;       swap(arr, min, i);       i = min;     }   }   private static void swap(int[] arr, int i, int j) {     if (i != j) {       arr[i] = arr[i] ^ arr[j];       arr[j] = arr[i] ^ arr[j];       arr[i] = arr[i] ^ arr[j];     }   } ```
2
送花
回复
分享
发布于 2020-04-25 23:59
这段代码槽点有点多……你用小根堆是要降序排序是吗?
点赞
送花
回复
分享
发布于 2020-04-25 23:40
秋招专场
校招火热招聘中
官网直投
我就按小根堆降序排序给你改了改这段代码,从bug中我可以看出,你大概是基于大根堆的代码改的小根堆排序。bug 点主要出在这么几个位置: 1. 蜜汁 for 循环嵌套 while 循环,外层 i 自增 size 自减,删掉 for 循环即可 2. 蜜汁 early return,你大概是想写 break,或者以前是单独的辅助函数被你掺回了主要函数中 3. 一个潜在的 bug 点:异或 swap 很酷,但要注意 i 和 j 不能相等,否则就是 0 改好的代码如下,基于保留了原有代码的结构,还可以优化。
点赞
送花
回复
分享
发布于 2020-04-25 23:59

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务