在有序数组中插入值?

时间:2017-02-15 17:02:43

标签: java algorithm data-structures

我试图从John R Hubbard的书籍Data Structures with Java(例3.2)中为Java中的有序数组实现某种插入方法,以便插入元素并更快地对数组进行排序而不是转移元素或使用气泡分类。

有人解释我在下面的代码中发生了什么?我应该如何初始化变量' k' (作为' a'数组的索引数组)和a的值应该是什么(因为数组的0和2索引中没有值' a'在下面的图像中)

enter image description here

void insert(int x){

    int i=0;
    while (k[i] != 0 && a[k[i]] < x) {  
        i = k[i];
    }

    a[free] = x;
    k[free] = k[i];
    k[i] = free++;
}

2 个答案:

答案 0 :(得分:0)

您可以将ka初始化为空整数数组:

int[] a = new int[10];
int[] k = new int[10];
int free=0;

a中的空格可能是为了说明如果有一些删除可能会是什么样子。如果你要做的只是插入,a之前a[free]的所有元素都会有一个插入的值,尽管如果你插入一个0,它仍然可以是0,但这不是在示例

至于代码在做什么,这是一个更长的解释。 a中的数据值是我们插入的数据。 k中的数据值是对ak中的索引元素的引用,我们可以按照这些索引元素按升序遍历数据。 k[0]的值将始终包含具有最低数据值的a索引。因此,使用本书中的示例,k[0]为3. a[3]为22,而22是我们有序列表中的最低数据值。

k中的数据也用于遍历k的元素,我们总是从0开始。所以下一个元素是k[3],其中包含5 { {1}}是33,是我们数据中第二低的数字。

因此,如果我们想在列表中插入27,并且我们遵循此算法,则a[5]中的相关条目为kk[0]==3k[3]==5。插入后,k[5]==1将为27,因为插入后a[7]为7(插入后将为8)。 free仍为3,因为22仍是我们的最低值数据。 k[0]将为7,因为我们的第二低数据值现在为27,并存储在k[3]a[7]将为5,因为k[7]为33,现在是我们的第三低数据值,a[5]仍为1(未更改)。

那么我们在k[5]指数0,3,5,1,4,6之后遍历我们的列表(根据该书),我们现在将遵循这条道路:0,3,7,5 ,1,4,6,给我们数据值:22,27,33,44,55,66

答案 1 :(得分:0)

问题#1:

  

有人可以解释一下下面的代码片段中发生了什么吗?

答案#1:

让我们首先检查一个人如何迭代这样的结构并按顺序打印元素。我在您的问题中使用了本书中的示例:

Figure 1: Iterating an array with 2 level indexing

以下是Java的外观:

int i = 0;
while (k[i] != 0) {
    System.out.println(a[k[i]]);
    i = k[i];
}

过程insert(x)x插入a[free],将旧的k[i]推送到k[free]并用{{1}覆盖k[i]的先前值其中free是有序结构中第一个大于或等于a[k[i]]的元素。然后递增x

不幸的是,通过练习和模拟可以获得对算法的完全理解(通常不是)

<小时/>

问题#2:

  

我应该如何初始化变量free(作为k数组的索引数组)以及a的值应该是什么?

答案#2:

本书中的例子看起来很不错:

a

注意:此过程依赖于import java.util.Arrays; class IndirectReference { static final int Q = 0; // This value is irrelevant; added for clarity static int a[] = {Q, 44, Q, 22, 55, 33, 66, Q}; static int k[] = {3, 4, Q, 5, 6, 1, 0, Q, Q, Q}; static int free = 7; public static void main(String[] args) { insert(50); System.out.print("a = "); System.out.println(Arrays.toString(a)); System.out.print("k = "); System.out.println(Arrays.toString(k)); System.out.println("free = " + free); } static void insert(int x) { int i = 0; while (k[i] != 0 && a[k[i]] < x) { i = k[i]; } a[free] = x; k[free] = k[i]; k[i] = free++; } } 保存两个表中下一个空闲位置的索引这一事实。

在上面的示例中,在插入free后错误地将其设置为8,因为该过程假定索引50处始终有足够的空间,{ {1}},free,... free+1free+2

一旦发生这种情况,您可以调整两个数组的大小或压缩它们(在两个表的末尾放置非尾随a)。在后一种情况下,您基本上必须重新索引两个表。