Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 插入排序和哨兵_Java_Algorithm_Insertion Sort_Sentinel - Fatal编程技术网

Java 插入排序和哨兵

Java 插入排序和哨兵,java,algorithm,insertion-sort,sentinel,Java,Algorithm,Insertion Sort,Sentinel,我正在努力理解Insertionsort。我听说我可以用哨兵来提高它 这是我没有哨兵的代码: public static int[] insertionSort(int[] sortieren) { int temp; for (int i = 1; i < sortieren.length; i++) { temp = sortieren[i]; int j = i; while (j > 0 && s

我正在努力理解Insertionsort。我听说我可以用哨兵来提高它

这是我没有哨兵的代码:

public static int[] insertionSort(int[] sortieren) {
    int temp;
    for (int i = 1; i < sortieren.length; i++) {
        temp = sortieren[i];
        int j = i;
        while (j > 0 && sortieren[j - 1] > temp) {
            sortieren[j] = sortieren[j - 1];
            j--;
        }
        sortieren[j] = temp;
    }
    return sortieren;
}
publicstatic int[]insertionSort(int[]sortieren){
内部温度;
for(int i=1;i0&&sortieren[j-1]>temp){
sortieren[j]=sortieren[j-1];
j--;
}
sortieren[j]=温度;
}
返回sortieren;
}
我目前正在尝试了解在哪种情况下可以获得ArrayIndexOutOfBounds异常。你能帮助我理解为什么需要一个哨兵来改进代码,以及我必须在哪里输入它吗?我会说,我必须在数组的左边缘放置一个Integer.MIN_值,但我不确定,因为我没有看到它超出数组的情况

如果您能帮助我了解Insertionsort中哨兵的用法,我将不胜感激

有哨兵…

    public void insertionSort(int[] array) {

    int temp;
    int arraySentinel[] = new int[array.length+1];
    for(int i = 0; i < array.length; i++){
        arraySentinel[i+1] = array[i];
    }
    arraySentinel[0] = Integer.MIN_VALUE;

    for (int i = 1; i < arraySentinel.length; i++) {
            temp = arraySentinel[i];
            int j = i;
            /**
             * Stabil weil sortieren[j-1] > temp!
             * Wäre nicht stabil wenn >=!
             */
            while (arraySentinel[j - 1] > temp) {
                arraySentinel[j] = arraySentinel[j - 1];
                j--;
            }
            arraySentinel[j] = temp;                
    }

    for (int i = 1; i < arraySentinel.length; i++){
        array[i-1] = arraySentinel[i];
    }
}
public void insertionSort(int[]数组){
内部温度;
int-arraysentel[]=新的int[array.length+1];
for(int i=0;i温度!
*我们没有稳定的生活!
*/
而(阵列温度[j-1]>温度){
ArraySentel[j]=ArraySentel[j-1];
j--;
}
阵列温度[j]=温度;
}
for(int i=1;i
静态哨兵将是一个非常低的值,它将作为数组的第一个元素,即数组[0]中的元素。这样做的好处是不检查代码中的条件“j>0”

添加了j>0条件,以便程序不会给出ArrayIndexOutOfBounds异常。通过在数组[0]处添加一个填充元素,并从数组[1…n]运行循环,我们节省了检查j>0条件的开销

请注意,无条件地,它不会影响插入排序的复杂性


编辑:修改后的实施是正确的。我假设您感到困惑,因为现在您必须再次填充整个数组,这将需要额外的θ(n)时间。所以您担心添加sentinel实际上会使速度变慢。但是,您需要了解这是Java的问题。Java数组具有不可变的大小,因此需要创建一个新数组。这不是算法的了望。算法与语言无关。如果您使用其他具有可变数组大小规定的语言,或者使用Java的列表,那么sentinel可以在O(1)时间内添加。在这种情况下,生成的程序将更快。

您不需要创建更大的新阵列

只需在数组中运行一次,找到最小元素并将其移动到第0个位置


现在,这个元素可以作为哨兵,您可以在不进行边界检查的情况下对数组的其余部分进行排序。

谢谢您。但是,如果我想实现这个哨兵,我将创建一个长度为+1的新数组,我的代码是否仍然在原地?或者我可以用更好的方式来实现这一点。我在主题中添加了新代码。您的实现似乎正确。我能理解为什么它看起来似乎没有什么用处,因为它对整体复杂性没有任何影响。但是您必须认识到,您只是在减少开销常数,因此它不会减少渐进复杂性。事实上,插入排序被广泛使用,因为它的内部循环非常有效,只需使用很少的常量,并进行适当的交换。好的,谢谢。我终于明白了!也许与ArrayList mhm合作更好。我添加了新代码,希望现在一切正常:)没问题!感谢您为实现sentinel代码而付出的努力,并再次询问您的问题。表明你真的想知道。快乐编程:)嘿,如果您的问题得到满意的回答,请将其标记为已回答!