合并排序算法不适用于大型数据集
Mergesort Algorithm isn't working for large datasets
我正在研究合并排序算法,但找不到我的错误。输出大部分是排序的,直到它随机列出几个整数的末尾:
1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 47 486 4 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 30 13 14 83 94
public static void main(String args[]) throws IOException {
Scanner scan = new Scanner(System.in);
System.out.println("Enter dataset size: ");
int size = scan.nextInt();
String file = "" + size + ".txt";
scan.close();
Scanner scanner = new Scanner(new File(file));
// read numbers from text file into the array
// set array size to the user input size
// while loop reads text file until each int is read
int array[] = new int[size];
int i = 0;
while(scanner.hasNext()) {
array[i++] = scanner.nextInt();
}
scanner.close();
// create 4 copies of the array to test each in a separate algorithm
int array1[] = new int[size];
int array2[] = new int[size];
int array3[] = new int[size];
int array4[] = new int[size];
for (int j = 0; j < array.length; j++) {
array1[j] = array[j];
array2[j] = array[j];
array3[j] = array[j];
array4[j] = array[j];
}
// test bubble sort
// this inputs the array and outputs time taken to compute
bubbleSort(array1);
// test selection sort
// this inputs the array and outputs time taken to compute
selectionSort(array2);
//quickSort(array3, 0, array3[array3.length-1]);
// test merge sorting algorithm
mergeSort(array4, 0, array4[array4.length-1]);
System.out.println();
for (int k = 0; k<array4.length; k++) {
System.out.print(array4[k] + " ");
}
}
public static void mergeSort(int arr[], int start, int end) {
if (start < end) {
int mid = (start + end)/2;
mergeSort(arr, start, mid);
mergeSort(arr, mid+1, end);
merge(arr, start, mid, end);
}
}
private static void merge(int arr[], int start, int mid, int end) {
int n1 = mid - start + 1;
int n2 = end - mid;
int left[] = new int[n1];
int right[] = new int[n2];
for (int i = 0; i <n1; i++) {
left[i] = arr[start+i];
}
for (int j = 0; j < n2; j++) {
right[j] = arr[mid + 1 + j];
}
int i = 0;
int j = 0;
int k = start;
while (i < n1 && j < n2) {
if (left[i] <= right[j]) {
arr[k] = left[i];
i++;
} else {
arr[k] = right[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = left[i];
i++;
k++;
}
while (j < n2) {
arr[k] = right[j];
j++;
k++;
}
}
问题在于您如何调用 mergeSort
:
// test merge sorting algorithm
mergeSort(array4, 0, array4[array4.length-1]);
尝试将 array4[array4.length-1]
替换为 array4.length-1
。
我正在研究合并排序算法,但找不到我的错误。输出大部分是排序的,直到它随机列出几个整数的末尾:
1 2 3 4 5 6 7 8 9 10 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 47 486 4 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 30 13 14 83 94
public static void main(String args[]) throws IOException {
Scanner scan = new Scanner(System.in);
System.out.println("Enter dataset size: ");
int size = scan.nextInt();
String file = "" + size + ".txt";
scan.close();
Scanner scanner = new Scanner(new File(file));
// read numbers from text file into the array
// set array size to the user input size
// while loop reads text file until each int is read
int array[] = new int[size];
int i = 0;
while(scanner.hasNext()) {
array[i++] = scanner.nextInt();
}
scanner.close();
// create 4 copies of the array to test each in a separate algorithm
int array1[] = new int[size];
int array2[] = new int[size];
int array3[] = new int[size];
int array4[] = new int[size];
for (int j = 0; j < array.length; j++) {
array1[j] = array[j];
array2[j] = array[j];
array3[j] = array[j];
array4[j] = array[j];
}
// test bubble sort
// this inputs the array and outputs time taken to compute
bubbleSort(array1);
// test selection sort
// this inputs the array and outputs time taken to compute
selectionSort(array2);
//quickSort(array3, 0, array3[array3.length-1]);
// test merge sorting algorithm
mergeSort(array4, 0, array4[array4.length-1]);
System.out.println();
for (int k = 0; k<array4.length; k++) {
System.out.print(array4[k] + " ");
}
}
public static void mergeSort(int arr[], int start, int end) {
if (start < end) {
int mid = (start + end)/2;
mergeSort(arr, start, mid);
mergeSort(arr, mid+1, end);
merge(arr, start, mid, end);
}
}
private static void merge(int arr[], int start, int mid, int end) {
int n1 = mid - start + 1;
int n2 = end - mid;
int left[] = new int[n1];
int right[] = new int[n2];
for (int i = 0; i <n1; i++) {
left[i] = arr[start+i];
}
for (int j = 0; j < n2; j++) {
right[j] = arr[mid + 1 + j];
}
int i = 0;
int j = 0;
int k = start;
while (i < n1 && j < n2) {
if (left[i] <= right[j]) {
arr[k] = left[i];
i++;
} else {
arr[k] = right[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = left[i];
i++;
k++;
}
while (j < n2) {
arr[k] = right[j];
j++;
k++;
}
}
问题在于您如何调用 mergeSort
:
// test merge sorting algorithm
mergeSort(array4, 0, array4[array4.length-1]);
尝试将 array4[array4.length-1]
替换为 array4.length-1
。