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