Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用heapsort进行排序 导入java.util.array; 公开课考试{ //主要方法 公共静态void main(字符串…参数){ int[]a=新的int[]{16,14,10,8,7,9,3,2,4,1}; System.out.println(“未排序数组”+Arrays.toString(a)); 堆排序(a); System.out.println(“排序数组”+Arrays.toString(a)); } //返回给定索引的左子索引 私有静态int左_子级(int i){ 返回(i*2+1); } //返回给定索引的右子索引 私有静态整数右\子项(整数i){ 返回(i*2+2); } 公共静态void max_heapify(int[]数组、int索引、int堆大小){ int=指数; int left=left_子项(索引); int right=右侧子对象(索引); if(左array[index]){ 最大=左; } 否则最大=指数; if(右数组[最大]){ 最大=右; } 如果(最大!=索引){ //交换数组[索引]与数组[最大] int a=数组[索引]; 数组[索引]=数组[最大]; 数组[最大]=a; 最大堆大小(数组、最大值、堆大小); } } 公共静态无效生成\u最大\u堆(int[]数组){ int heap_size=array.length-1; 对于(int i=((array.length-1)/2);i>=0;i--){ 最大堆大小(数组、i、堆大小); } } //主堆排序函数 公共静态无效堆_排序(int[]数组){ int heap_size=array.length-1; 构建最大堆(数组); 对于(inti=(array.length-1);i>0;i--){ //将数组[0]与数组[i]交换 int a=数组[0]; 数组[0]=数组[i]; 数组[i]=a; 堆大小=堆大小-1; 最大堆大小(数组,1,堆大小); } } }_Java_Algorithm - Fatal编程技术网

在java中使用heapsort进行排序 导入java.util.array; 公开课考试{ //主要方法 公共静态void main(字符串…参数){ int[]a=新的int[]{16,14,10,8,7,9,3,2,4,1}; System.out.println(“未排序数组”+Arrays.toString(a)); 堆排序(a); System.out.println(“排序数组”+Arrays.toString(a)); } //返回给定索引的左子索引 私有静态int左_子级(int i){ 返回(i*2+1); } //返回给定索引的右子索引 私有静态整数右\子项(整数i){ 返回(i*2+2); } 公共静态void max_heapify(int[]数组、int索引、int堆大小){ int=指数; int left=left_子项(索引); int right=右侧子对象(索引); if(左array[index]){ 最大=左; } 否则最大=指数; if(右数组[最大]){ 最大=右; } 如果(最大!=索引){ //交换数组[索引]与数组[最大] int a=数组[索引]; 数组[索引]=数组[最大]; 数组[最大]=a; 最大堆大小(数组、最大值、堆大小); } } 公共静态无效生成\u最大\u堆(int[]数组){ int heap_size=array.length-1; 对于(int i=((array.length-1)/2);i>=0;i--){ 最大堆大小(数组、i、堆大小); } } //主堆排序函数 公共静态无效堆_排序(int[]数组){ int heap_size=array.length-1; 构建最大堆(数组); 对于(inti=(array.length-1);i>0;i--){ //将数组[0]与数组[i]交换 int a=数组[0]; 数组[0]=数组[i]; 数组[i]=a; 堆大小=堆大小-1; 最大堆大小(数组,1,堆大小); } } }

在java中使用heapsort进行排序 导入java.util.array; 公开课考试{ //主要方法 公共静态void main(字符串…参数){ int[]a=新的int[]{16,14,10,8,7,9,3,2,4,1}; System.out.println(“未排序数组”+Arrays.toString(a)); 堆排序(a); System.out.println(“排序数组”+Arrays.toString(a)); } //返回给定索引的左子索引 私有静态int左_子级(int i){ 返回(i*2+1); } //返回给定索引的右子索引 私有静态整数右\子项(整数i){ 返回(i*2+2); } 公共静态void max_heapify(int[]数组、int索引、int堆大小){ int=指数; int left=left_子项(索引); int right=右侧子对象(索引); if(左array[index]){ 最大=左; } 否则最大=指数; if(右数组[最大]){ 最大=右; } 如果(最大!=索引){ //交换数组[索引]与数组[最大] int a=数组[索引]; 数组[索引]=数组[最大]; 数组[最大]=a; 最大堆大小(数组、最大值、堆大小); } } 公共静态无效生成\u最大\u堆(int[]数组){ int heap_size=array.length-1; 对于(int i=((array.length-1)/2);i>=0;i--){ 最大堆大小(数组、i、堆大小); } } //主堆排序函数 公共静态无效堆_排序(int[]数组){ int heap_size=array.length-1; 构建最大堆(数组); 对于(inti=(array.length-1);i>0;i--){ //将数组[0]与数组[i]交换 int a=数组[0]; 数组[0]=数组[i]; 数组[i]=a; 堆大小=堆大小-1; 最大堆大小(数组,1,堆大小); } } },java,algorithm,Java,Algorithm,我已经尝试了几乎所有的可能性,但效果并不好。你能找出我错在哪里吗。 我的代码的输出是: 未排序数组[16,14,10,8,7,9,3,2,4,1] 排序数组[14、10、8、7、9、3、2、4、1、16]问题是您将项目松散,因为左右子项必须: import java.util.Arrays; public class Test{ //main method public static void main(String... args){ int[] a = new int[]{16,

我已经尝试了几乎所有的可能性,但效果并不好。你能找出我错在哪里吗。 我的代码的输出是: 未排序数组[16,14,10,8,7,9,3,2,4,1]
排序数组[14、10、8、7、9、3、2、4、1、16]

问题是您将项目松散,因为左右子项必须:

import java.util.Arrays;

public class Test{

//main method
public static void main(String... args){
    int[] a = new int[]{16,14,10,8,7,9,3,2,4,1};

    System.out.println("unsorted array " + Arrays.toString(a));

    heap_sort(a);

    System.out.println("Sorted array " + Arrays.toString(a));
}

//returns left child index of given index
private static int left_child(int i){
return (i * 2 + 1);
}

//returns right child index of the given index
private static int right_child(int i){
    return (i * 2 + 2);
}


public static void max_heapify(int[] array , int index , int heap_size){
    int largest = index;
    int left = left_child(index);
    int right = right_child(index);

    if(left < heap_size && array[left] > array[index]){
        largest = left;
    }
    else largest = index;

    if (right < heap_size && array[right] > array[largest]){
        largest = right;
    }

    if(largest != index){
        //exchange array[index] with array[largest]
        int a = array[index];
        array[index] = array[largest];
        array[largest] = a;

        max_heapify(array,largest,heap_size);
    }
}

public static void build_max_heap(int[] array){
    int heap_size = array.length - 1;


    for (int i = ((array.length - 1) / 2) ; i >= 0 ; i--){
        max_heapify(array, i, heap_size);
    }
}

//main heap sort function 
public static void heap_sort(int[] array){

    int heap_size = array.length - 1;


    build_max_heap(array);

    for(int i = (array.length - 1) ; i > 0 ; i--){
        //exchange array[0] with array[i]
        int a = array[0];
        array[0] = array[i];
        array[i] = a;

        heap_size = heap_size - 1;
        max_heapify(array , 1 , heap_size);
    }
}


}
存在一些问题: -“左”和“右”子元素被修改,因为您松开了数组中的第一个元素。 -在max_heapify函数中,循环为=0;我——) { 最大堆大小(数组、i、堆大小); } } //主堆排序函数 公共静态无效堆_排序(int[]数组) { int heap_size=array.Length-1; 构建最大堆(数组); 对于(inti=(array.Length-1);i>0;i--) { //将数组[0]与数组[i]交换 int a=数组[0]; 数组[0]=数组[i]; 数组[i]=a; 堆大小=堆大小-1; 最大堆大小(数组,0,堆大小); } }
结果是一样的吗?是的!结果是一样的。另一点:if(left array[index]){max=left;}else-max=index;if(右数组[maximum]){maximum=right;}。您永远不会到达第一个和最后一个元素。当使用基于0的数组(如Java、C和许多其他语言)作为堆时,您可以看到未排序的数组[16、14、10、8、7、9、3、2、4、1]排序的数组[14、10、8、7、9、3、3、2、4、1、16],对于左边的孩子使用索引
i*2+1
,对于右边的孩子使用索引
i*2+2
,这是标准的。
//returns left child index of given index
private static int left_child(int i){
return (i * 2);
}

//returns right child index of the given index
private static int right_child(int i){
    return (i * 2 + 1);
}
  //returns left child index of given index
    private static int left_child(int i)
    {
        return (i * 2);
    }

    //returns right child index of the given index
    private static int right_child(int i)
    {
        return (i * 2 + 1);
    }

    public static void max_heapify(int[] array, int index, int heap_size)
    {
        int largest = index;
        int left = left_child(index);
        int right = right_child(index);

        if (left <= heap_size && array[left] > array[index])
        {
            largest = left;
        }

        if (right <= heap_size && array[right] > array[largest])
        {
            largest = right;
        }

        if (largest != index)
        {
            //exchange array[index] with array[largest]
            int a = array[index];
            array[index] = array[largest];
            array[largest] = a;

            max_heapify(array, largest, heap_size);
        }
    }

    public static void build_max_heap(int[] array)
    {
        int heap_size = array.length - 1;


        for (int i = ((array.length - 1) / 2); i >= 0; i--)
        {
            max_heapify(array, i, heap_size);
        }
    }

    //main heap sort function 
    public static void heap_sort(int[] array)
    {

        int heap_size = array.Length - 1;


        build_max_heap(array);

        for (int i = (array.Length - 1); i > 0; i--)
        {
            //exchange array[0] with array[i]
            int a = array[0];
            array[0] = array[i];
            array[i] = a;

            heap_size = heap_size - 1;
            max_heapify(array, 0, heap_size);
        }
    }