![](/img/trans.png)
[英]Can you help me with my for loop? it isn't turning the right amount of degrees
[英]Can you help me get the right output for MergeSort using ArrayList
我是 mergeSort 的新手,我能够使用 integer 数组 int[] 来解决 mergeSort,但是每当我尝试使用 ArrayList 来实现它时,我似乎根本无法得到正确的顺序。 我试图理解为什么会这样,以及使用相同的方法和变量名的实际解决方案是什么。
/* Java program for Merge Sort */
import java.util.ArrayList;
import java.util.Scanner;
class MergeSort
{
// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
void merge(ArrayList<Integer> al, int beg, int mid, int end)
{
// Find sizes of two subarrays to be merged
int ls = mid - beg + 1;
int rs = end - mid;
/* Create temp arrays */
ArrayList lft = new ArrayList(ls);
ArrayList rgt = new ArrayList(rs);
/*Copy data to temp arrays*/
for (int i = 0; i < ls; i++)
lft.add(i, al.get(beg + i));
for (int j = 0; j < rs; ++j)
rgt.add(j, al.get(mid + 1 + j));
/* Merge the temp arrays */
// Initial indexes of first and second subarrays
int li;
int ri;
li = 0;
ri = 0;
// Initial index of merged subarry array
int mi = beg;
while (li < ls && ri < rs) {
if ((int)lft.get(li) <= (int)rgt.get(ri)) {
al.set(mi, (int)lft.get(li));
li++;
} else {
al.set(mi, (int)rgt.get(li));
ri++;
}
mi++;
}
/* Copy remaining elements of L[] if any */
while (li < ls) {
al.add(mi, (int)lft.get(li));
li++;
mi++;
}
/* Copy remaining elements of R[] if any */
while (ri < rs) {
al.add(mi, (int)rgt.get(ri));
ri++;
mi++;
}
}
// Main function that sorts arr[l..r] using
// merge()
void sort(ArrayList al, int beg, int end)
{
if (beg < end) {
// Find the middle point
int mid =beg+ (end-beg)/2;
// Sort first and second halves
sort(al, beg, mid);
sort(al, mid + 1, end);
// Merge the sorted halves
merge(al, beg, mid, end);
}
}
/* A utility function to print array of size n */
static void printArray(ArrayList al)
{
int arSize = al.size();
for (int i = 0; i < arSize; i++)
System.out.print(al.get(i) + " ");
System.out.println();
}
// Driver code
public static void main(String args[])
{
ArrayList finArr = new ArrayList();
finArr.add(11);
finArr.add(12);
finArr.add(10);
finArr.add(6);
finArr.add(1);
System.out.println("Given Array");
printArray(finArr);
MergeSort ob = new MergeSort();
ob.sort(finArr, 0, finArr.size() - 1);
System.out.println("\nSorted array");
printArray(finArr);
}
}
上述代码的output为:
Given Array
11 12 10 6 1
Sorted array
10 11 12 12 12 12 10 6 1
但是,我不明白为什么 output 不是:
Sorted array
1 6 10 11 12
由于您分配了具有初始大小的临时 arrays,因此您应该使用lft.set()
和rgt.set()
来设置值而不是.add
。 同样,从临时 arrays 复制剩余元素时,请使用al.set()
而不是 al.add( al.add()
。
这是修改后的版本:
/* Java program for Merge Sort */
import java.util.ArrayList;
import java.util.Scanner;
class MergeSort
{
// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
void merge(ArrayList<Integer> al, int beg, int mid, int end)
{
// Find sizes of two subarrays to be merged
int ls = mid - beg + 1;
int rs = end - mid;
/* Create temp arrays */
ArrayList lft = new ArrayList<Integer>(ls);
ArrayList rgt = new ArrayList<Integer>(rs);
/* Copy data to temp arrays */
for (int i = 0; i < ls; i++)
lft.set(i, al.get(beg + i));
for (int j = 0; j < rs; ++j)
rgt.set(j, al.get(mid + 1 + j));
/* Merge the temp arrays */
// Initial indexes of first and second subarrays
int li;
int ri;
li = 0;
ri = 0;
// Initial index of merged subarray array
int mi = beg;
while (li < ls && ri < rs) {
if ((int)lft.get(li) <= (int)rgt.get(ri)) {
al.set(mi, (int)lft.get(li));
li++;
} else {
al.set(mi, (int)rgt.get(li));
ri++;
}
mi++;
}
/* Copy remaining elements of L[] if any */
while (li < ls) {
al.set(mi, (int)lft.get(li));
li++;
mi++;
}
/* Copy remaining elements of R[] if any */
while (ri < rs) {
al.set(mi, (int)rgt.get(ri));
ri++;
mi++;
}
}
// Main function that sorts arr[l..r] using
// merge()
void sort(ArrayList al, int beg, int end)
{
if (beg < end) {
// Find the middle point
int mid = beg + (end - beg) / 2;
// Sort first and second halves
sort(al, beg, mid);
sort(al, mid + 1, end);
// Merge the sorted halves
merge(al, beg, mid, end);
}
}
/* A utility function to print array of size n */
static void printArray(ArrayList al)
{
int arSize = al.size();
for (int i = 0; i < arSize; i++)
System.out.print(al.get(i) + " ");
System.out.println();
}
// Driver code
public static void main(String args[])
{
ArrayList finArr = new ArrayList();
finArr.add(11);
finArr.add(12);
finArr.add(10);
finArr.add(6);
finArr.add(1);
System.out.println("Given Array");
printArray(finArr);
MergeSort ob = new MergeSort();
ob.sort(finArr, 0, finArr.size() - 1);
System.out.println("\nSorted array");
printArray(finArr);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.