我目前正在尝试用Java开发一个程序,该程序必须打印一个算法用于对数组中的元素进行排序的步骤(每次更改时数组中的所有元素),其中print表示在控制台中显示它,保存它作为文件或SwingComponent。
现在我正在使用Arraylist< int []>保存步骤,但它只允许我在抛出异常之前对少于1k的元素进行排序。
无论如何我可以保存更多元素的步骤吗?
代码
package tests;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class BubbleSort{
public void sort( int[] array, List<int[]> process ){
int len = array.length - 1;
int i, j, tmp;
process.add( array.clone() ); //Save original array
for( i = 0; i < len; ++i ){
for( j = 0; j < len - i; ++j ){
if( array[ j ] > array[ j + 1 ] ){
tmp = array[ j ];
array[ j ] = array[ j + 1 ];
array[ j + 1 ] = tmp;
process.add( array.clone() ); //Array changed, save it
}
}
}
}
//creates a random array
public static int[] randomIntegerArray( int min, int max, int amount ){
int[] array = new int[ amount ];
int total = max - min;
List< Integer > numbers = new ArrayList<>( total );
int i = 0;
for( i = min; i < max; ++i ){
numbers.add( i );
}
Collections.shuffle( numbers );
for( i = 0; i < amount; ++i ){
array[ i ] = numbers.remove( 0 );
}
return array;
}
public static void main( String[] args ){
BubbleSort bubbleSort = new BubbleSort();
List<int[]> process = new ArrayList<>();
int[] noError = randomIntegerArray( 0, 1000, 500 ); //Works up ~ 900
int[] error = randomIntegerArray( 0, 1000, 1000 );
bubbleSort.sort( noError, process);// Works
//bubbleSort.sort( error, process);// throws java.lang.OutOfMemoryError: Java heap space in line 22
//Print steps
//for( int[] a : process ){ System.out.println( Arrays.toString( a ) ); }
}
}
答案 0 :(得分:1)
无论如何我可以保存更多元素的步骤吗?
方法#1 - 增加堆大小。不幸的是,这不会扩展。
方法#2 - 不是在每次交换后保存整个数组,只需保存交换的元素对的详细信息。如有必要,您可以通过重放交换操作重建数组...从初始数组状态向前或从最终状态向后。
方法#3 - 根本不保存步骤。只需在排序时将它们输出到控制台/文件/ Swing组件。
关于可扩展性。
N
元素数组涉及O(N^2)
个步骤。O(N^3)
个内存来保存它们。对于大N
,那就是很多的内存!! O(N^2)
。那仍然是很多记忆。O(N)
,以便进行简单的实施。 (这是将数组状态格式化为字符串所需的内存量。如果需要,可以将其实现为O(1)
。)我正在使用的O(...)
内容称为"Big O" notation。粗略地说,O(N)
意味着与N
成比例......因为N
倾向于无穷大。这方面的数学基于极限。