解释插入排序的工作原理

时间:2015-10-01 17:57:51

标签: java sorting

我需要了解插入排序的算法。

如果有人能够以外行的方式解释这段代码是如何分解的。

  public void insertionSort() {
      int in, out;
    for(out=1; out<nElems; out++) {
        long temp = a[out];
              in = out;
                 while(in>0 && a[in-1] >= temp){
                        a[in] = a[in-1]; // shift item right,
                                  --in;
                                    a[in] = temp; } // end for

我想特别知道为什么

  1. 我不明白的是,在其他类型中我们使用for循环,在这一个中我们在这个特殊的排序中使用while循环?
  2. 2.a [in-1]&gt; = temp,他们是否使用了这个,因为我们删除了一个元素?

3 个答案:

答案 0 :(得分:0)

  

我不明白的是,在其他类型中我们使用for循环,和   在这一个中我们在这个特殊的排序中使用while循环?

嗯,没有。某些排序实现甚至没有循环。在这种特殊情况下,它们使用while循环,因为事先不知道迭代次数,但在Java中,for循环可以完成与while循环完全相同的事情,因此它是只是一个可读性问题

  

a [in-1]&gt; = temp,他们是否使用了这个,因为我们删除了一个   元素?

因为它们执行移位,这总是通过将一个移位元素存储在临时变量中来完成。这可能是最经典的编程技巧:

a = 5, b = 6
tmp = a
b = a
a = tmp
// now a is 6 and b is 5

答案 1 :(得分:0)

  1. while循环和for循环(基本上)是等价的,因为你总是可以这样做:

    for(int i = 0; i < n; i++) 
    

    作为

    int i = 0
    while (i < n) {
       ...
       i++;
    }
    
  2. int i的范围有点不同,例如在Java中,因为在for循环中,i的范围仅在循环内。)

    1. 不是。该算法试图在数组中向后移动当前值。 我认为其中的Wikipedia articlethis picture对理解这个概念非常有帮助。

答案 2 :(得分:0)

好吧,根据while循环的结构,它可以起到与循环相同的作用。此外,大多数种类都使用递归。我给你的建议是

1)查找插入排序,足够基本,但查看可视化表示并分析正在进行的操作。这将帮助您了解代码中发生的事情。

2)考虑运行时间(平均为O(n ^ 2)的情况)。为什么是O(n ^ 2)?这是什么意思?