java排序算法中记录元素的比较

java排序算法中记录元素的比较,java,algorithm,arraylist,insertion-sort,Java,Algorithm,Arraylist,Insertion Sort,嗨,我正在使用下面的插入排序算法,我想记录被比较的元素。基本上,我希望将比较存储在两个数组列表中,arrList1和arrList2。如果元素位于正确的位置,则两个数组列表将具有相同的元素。如果不是,则arrList1将具有所选元素,arrayList2将具有与其进行自身比较的元素。我目前正努力做到这一点,所以我想知道是否有人可以帮助我?谢谢 public static ArrayList<Integer> arrList1 = new ArrayList<Integer>

嗨,我正在使用下面的插入排序算法,我想记录被比较的元素。基本上,我希望将比较存储在两个数组列表中,arrList1和arrList2。如果元素位于正确的位置,则两个数组列表将具有相同的元素。如果不是,则arrList1将具有所选元素,arrayList2将具有与其进行自身比较的元素。我目前正努力做到这一点,所以我想知道是否有人可以帮助我?谢谢

public static ArrayList<Integer> arrList1 = new ArrayList<Integer>();
public static ArrayList<Integer> arrList2 = new ArrayList<Integer>();
...
        public static void insertSort(int[] A){
      for(int i = 1; i < A.length; i++){
        int value = A[i];
        int j = i - 1;
        while(j >= 0 && A[j] > value){
          A[j + 1] = A[j];
          j = j - 1;
        }
        A[j + 1] = value;
      }
    }
排序数组:1,2,3,4,5,6


如您所见,arrList1基本上是输入数组的顺序,而arrList2是它在位置不正确时所比较的元素。如果其位置正确,则列表2的值将相同。

编辑:现在我理解了这里的问题,这就是我的建议。首先请注意,插入排序具有sqare(O(n^2))复杂度,因此相同复杂度的另一次计算不会改变算法的总体复杂度。这就是您要做的-首先,通过遍历当前元素左侧的所有值来计算arrList2中的值,并搜索大于当前元素的第一个值。第二个阶段是简单的排序算法——正如您已经指出的,arrList1保存排序后的A。整个过程可以以更高的复杂性实现,但不使用插入排序

public static ArrayList<Integer> arrList1 = new ArrayList<Integer>();
public static ArrayList<Integer> arrList2 = new ArrayList<Integer>();
...
public static void insertSort(int[] A){
  for (int i = 0; i < A.length; ++i) {
    boolean found_greater = false;
    for (int j = i - 1; j >= 0; --j) {
      if (A[j] > A[i]) {
        found_greater = true;
        arrList2.add(A[j]);
        break;
      }
    }
    if (!found_greater) {
      arrList2.add(A[i]);
    }
  }

  for(int i = 1; i < A.length; i++){
    int value = A[i];
    int j = i - 1;
    while(j >= 0 && A[j] > value){
      A[j + 1] = A[j];
      j = j - 1;
    }

    arrList1.add(A[i]);
    A[j + 1] = value;
  }
}
public static ArrayList arrList1=new ArrayList();
public static ArrayList arrList2=新的ArrayList();
...
公共静态void insertSort(int[]A){
对于(int i=0;i=0;--j){
如果(A[j]>A[i]){
发现大于等于真;
第2条增补(A[j]);
打破
}
}
如果(!发现更大){
第2条增补(A[i]);
}
}
for(int i=1;i=0&&A[j]>值){
A[j+1]=A[j];
j=j-1;
}
第1条增补(A[i]);
A[j+1]=值;
}
}
你有

public class Test {
    public static List<Integer> arrList1;
    public static ArrayList<Integer> arrList2 = new ArrayList<Integer>();

    public static void main (String... args){
        Integer[] toSort = {1, 3, 2, 4, 6, 5};


        arrList1 = Arrays.asList(Arrays.copyOf(toSort, toSort.length));
        insertSort(toSort);

        List<Integer> sortedArray = new ArrayList<Integer>();
        for(int aux: toSort){
            sortedArray.add(aux);
        }

        System.out.println("Array list 1: " + arrList1);
        System.out.println("Array list 2: " + arrList2);
        System.out.println("Sorted array: " + sortedArray);
    }

    public static void insertSort(Integer[] A){
        arrList2.add(arrList1.get(0));
        for(int i = 1; i < A.length; i++){
            int value = A[i];
            int j = i - 1;
            if ((j >= 0 && A[j] > value)){
                arrList2.add(A[j]);
            }else{
                arrList2.add(A[i]);
            }
            while(j >= 0 && A[j] > value){
                A[j + 1] = A[j];
                j = j - 1;
            }

            A[j + 1] = value;
        }
    }
}
公共类测试{
公共静态列表arrList1;
public static ArrayList arrList2=新的ArrayList();
公共静态void main(字符串…参数){
整数[]toSort={1,3,2,4,6,5};
arrList1=Arrays.asList(Arrays.copyOf(toSort,toSort.length));
插入排序(toSort);
List sortedArray=new ArrayList();
用于(int aux:toSort){
分拣机。添加(辅助);
}
System.out.println(“数组列表1:+arrList1”);
System.out.println(“数组列表2:+arrList2”);
System.out.println(“排序数组:“+sortedDarray”);
}
公共静态void insertSort(整数[]A){
arrList2.add(arrList1.get(0));
for(int i=1;i=0&&A[j]>值)){
第2条增补(A[j]);
}否则{
第2条增补(A[i]);
}
而(j>=0&&A[j]>值){
A[j+1]=A[j];
j=j-1;
}
A[j+1]=值;
}
}
}
对于我来说,此代码的输出是:

数组列表1:[1,3,2,4,6,5] 数组列表2:[1,3,3,4,6,6]
排序数组:[1、2、3、4、5、6]

我不太明白你的问题是什么意思。。。你能给我们举个例子吗。。。所以如果A=this,那么我希望arrList1是那个,arrList2是那个。。。也许有了这个例子,你会得到更多的答案。现在编辑它使它更清晰。有人能帮忙吗?我添加了更清晰的描述。好的。。现在看一下…现在检查我的答案。。。如果这就是你要找的…好吧,这个例子怎么样,8,7,6,2这里2比前面所有的元素都大,那么哪一个应该在arrList2中?它是左边的第一个(即6)。我说的对吗?在arrList2中,你要么有元素,要么左边的第一个元素比它大?是的,这是正确的。arrList1将显示2,arrList2将显示它所比较的数字。例如,当我们得到2时,arrList2将在左边有一个更大的。这将一直发生,直到2在它的正确位置我已经改变了我的答案,以反映实际的问题。希望能有帮助。
public class Test {
    public static List<Integer> arrList1;
    public static ArrayList<Integer> arrList2 = new ArrayList<Integer>();

    public static void main (String... args){
        Integer[] toSort = {1, 3, 2, 4, 6, 5};


        arrList1 = Arrays.asList(Arrays.copyOf(toSort, toSort.length));
        insertSort(toSort);

        List<Integer> sortedArray = new ArrayList<Integer>();
        for(int aux: toSort){
            sortedArray.add(aux);
        }

        System.out.println("Array list 1: " + arrList1);
        System.out.println("Array list 2: " + arrList2);
        System.out.println("Sorted array: " + sortedArray);
    }

    public static void insertSort(Integer[] A){
        arrList2.add(arrList1.get(0));
        for(int i = 1; i < A.length; i++){
            int value = A[i];
            int j = i - 1;
            if ((j >= 0 && A[j] > value)){
                arrList2.add(A[j]);
            }else{
                arrList2.add(A[i]);
            }
            while(j >= 0 && A[j] > value){
                A[j + 1] = A[j];
                j = j - 1;
            }

            A[j + 1] = value;
        }
    }
}