【问题标题】:MergeSort java Graphical representationMergeSort java 图形表示
【发布时间】:2015-01-13 19:48:07
【问题描述】:

您好,我有合并排序类,我想绘制排序数组的直方图,当尝试从屏幕上的排序类中检索数据时,只出现未排序的数组,然后是排序的数组。我必须如何重组我的排序类,以便在每次排序时返回完整的数组,或者我如何检索合并(数组,左,右)(我认为这是我必须用来创建直方图的部分)

package mergeSort;


import java.util.*;

public class MergeSort {
    public static void main(String[] args) {
        int[] list = {14, 32, 67, 76, 23, 41, 58, 85};
        System.out.println("before: " + Arrays.toString(list));
        mergeSort(list);
        System.out.println("after:  " + Arrays.toString(list));
    }

    public static void mergeSort(int[] array) {
        if (array.length > 1) {
            // split array into two halves
            int[] left = leftHalf(array);
            int[] right = rightHalf(array);

            // recursively sort the two halves
            mergeSort(left);
            mergeSort(right);

            // merge the sorted halves into a sorted whole
            merge(array, left, right);
        }
    }

    // Returns the first half of the given array.
    public static int[] leftHalf(int[] array) {
        int size1 = array.length / 2;
        int[] left = new int[size1];
        for (int i = 0; i < size1; i++) {
            left[i] = array[i];
        }
        return left;
    }

    // Returns the second half of the given array.
    public static int[] rightHalf(int[] array) {
        int size1 = array.length / 2;
        int size2 = array.length - size1;
        int[] right = new int[size2];
        for (int i = 0; i < size2; i++) {
            right[i] = array[i + size1];
        }
        return right;
    }

    public static void merge(int[] result, int[] left, int[] right) {
        int i1 = 0;   // index into left array
        int i2 = 0;   // index into right array

        for (int i = 0; i < result.length; i++) {
            if (i2 >= right.length || (i1 < left.length && 
                    left[i1] <= right[i2])) {
                result[i] = left[i1];    // take from left
                i1++;
            } else {
                result[i] = right[i2];   // take from right
                i2++;
            }
        }
    }
 }

另外,当我调用冒泡排序时,一切正常,所以我认为我必须重组 mergeClass 如果你有想法请分享谢谢

这是我的打印方法

int Value = 100;
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int edge= 50;
        for (int i = 0; i < array.length; i++) {
            g.drawLine(i + offSet, Value + edge, i + edge,
                    Value + edge- array[i]);
        }
    }

冒泡排序

    public void bubbleSort(int[] a) throws InterruptedException {
    for (int i = 0; i < a.length; i++) {
        for (int j = 1; j < (a.length - i); j++) {
            if (a[j - 1] > a[j])
                swap(a, j - 1, j);
        }
    }
}

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    记录每个步骤(而不是返回每个步骤)就足够了吗?如果是这样,以下将为您提供一个 int[] 数组列表,每个数组都存储排序过程的每个步骤的值。然后,您可以遍历列表并在闲暇时显示它。
    以下:

    package mergeSort;
    
    
    import java.util.*;
    
    public class MergeSort {
    
        public static void main(String[] args) {
            int[] list = {14, 32, 67, 76, 23, 41, 58, 85};
    
            List<int[]> listOfLists = new ArrayList<int[]>();
    
            System.out.println("before: " + Arrays.toString(list));
            mergeSort(list,listOfLists);
            System.out.println("after:  " + Arrays.toString(list));
    
            System.out.println("Each step:");
            for(int[] arrList : listOfLists)
                System.out.println(Arrays.toString(arrList));
        }
    
        public static void mergeSort(int[] array, List<int[]> listOfLists) {
            if (array.length > 1) {
                // split array into two halves
                int[] left = leftHalf(array);
                int[] right = rightHalf(array);
    
                // recursively sort the two halves
                mergeSort(left,listOfLists);
                mergeSort(right,listOfLists);
    
                // merge the sorted halves into a sorted whole
                merge(array, left, right);
                listOfLists.add(array);
    
            }
        }
    
        // Returns the first half of the given array.
        public static int[] leftHalf(int[] array) {
            int size1 = array.length / 2;
            int[] left = new int[size1];
            for (int i = 0; i < size1; i++) {
                left[i] = array[i];
            }
            return left;
        }
    
        // Returns the second half of the given array.
        public static int[] rightHalf(int[] array) {
            int size1 = array.length / 2;
            int size2 = array.length - size1;
            int[] right = new int[size2];
            for (int i = 0; i < size2; i++) {
                right[i] = array[i + size1];
            }
            return right;
        }
    
        public static void merge(int[] result, int[] left, int[] right) {
            int i1 = 0;   // index into left array
            int i2 = 0;   // index into right array
    
            for (int i = 0; i < result.length; i++) {
                if (i2 >= right.length || (i1 < left.length && 
                        left[i1] <= right[i2])) {
                    result[i] = left[i1];    // take from left
                    i1++;
                } else {
                    result[i] = right[i2];   // take from right
                    i2++;
                }
            }
        }
     }
    

    会返回这个:

    before: [14, 32, 67, 76, 23, 41, 58, 85]
    after:  [14, 23, 32, 41, 58, 67, 76, 85]
    Each step:
    [14, 32]
    [67, 76]
    [14, 32, 67, 76]
    [23, 41]
    [58, 85]
    [23, 41, 58, 85]
    [14, 23, 32, 41, 58, 67, 76, 85]
    

    【讨论】:

    • 如何将该列表传递给我的绘图方法
    • 我不知道你的绘图方法是如何工作的,所以我不能说。您可以发布您的绘图方法和/或冒泡排序类,也许我们可以弄清楚。
    【解决方案2】:

    好的,我想我明白你的问题了。这对你有用吗?在我放置 println 语句的地方,您可以改为呈现当前数组。

    package mergeSort;
    
    import java.util.Arrays;
    
    public class MergeSort {
    
        public static void main(String[] args) {
            int[] list = { 14, 32, 76, 67, 41, 23, 58, 85 };
    
            System.out.println("before: " + Arrays.toString(list));
            mergeSort(list, 0, list.length - 1);
            System.out.println("after:  " + Arrays.toString(list));
    
        }
    
        public static void mergeSort(int[] array, int left, int right) {
            int mid = 0;
    
            if (right > left) {
                mid = (right + left) / 2;
    
                // sort left
                mergeSort(array, left, mid);
                // sort right
                mergeSort(array, mid + 1, right);
                // merge them
                merge(array, left, mid+1, right);
    
                // PUT YOUR HOOK TO DRAW THE ARRAY HERE
                System.out.println("during: " + Arrays.toString(array));
            }
    
        }
    
        public static void merge(int[] numbers, int left, int mid, int right) {
            int[] temp = new int[numbers.length];
            int i, left_end, num_elements, tmp_pos;
            left_end = (mid - 1);
            tmp_pos = left;
            num_elements = (right - left + 1);
    
            while ((left <= left_end) && (mid <= right)) {
                if (numbers[left] <= numbers[mid])
                    temp[tmp_pos++] = numbers[left++];
                else
                    temp[tmp_pos++] = numbers[mid++];
            }
    
            while (left <= left_end)
                temp[tmp_pos++] = numbers[left++];
    
            while (mid <= right)
                temp[tmp_pos++] = numbers[mid++];
    
            for (i = 0; i < num_elements; i++){
                numbers[right] = temp[right];
                right--;
            }
        }
    
    }
    

    产生的输出是这样的:

    before: [14, 32, 76, 67, 41, 23, 58, 85]
    during: [14, 32, 76, 67, 41, 23, 58, 85]
    during: [14, 32, 67, 76, 41, 23, 58, 85]
    during: [14, 32, 67, 76, 41, 23, 58, 85]
    during: [14, 32, 67, 76, 23, 41, 58, 85]
    during: [14, 32, 67, 76, 23, 41, 58, 85]
    during: [14, 32, 67, 76, 23, 41, 58, 85]
    during: [14, 23, 32, 41, 58, 67, 76, 85]
    after:  [14, 23, 32, 41, 58, 67, 76, 85]
    

    【讨论】:

    • 不,当我调用像 mergeSort(array); 这样的方法时,我的想法是行不通的。该方法将在排序的每一步返回数组我正在尝试以这种方式重写排序方法,如果您有任何其他想法请分享
    • Java 中的方法不能多次返回。一次调用 mergeSort(array) 将返回一个(或零)值。它可以返回一个包含许多值的数组,或者一个存储许多值的对象,但它仍然只会返回一次。
    • 请看上面的冒泡排序。如果可以请解释一下冒泡排序动画如何显示排序过程
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多