java - 合并排序与选择排序

标签 java algorithm sorting mergesort selection-sort

我写了这两种排序算法,看起来选择排序比归并排序快,这肯定不是对的吧?我的测试数据是 10 个大小为 5000 到 50000 的随机数组,其中数组中最大可能的数字是 100。

这是我的选择排序实现:

int i, j, iMin;
int n = c.length;

startTime = System.currentTimeMillis();
for (i = 0; i < n - 1; i++) {
    iMin = i;
    for (j = i + 1; j < n; j++)
        if (c[j] < c[iMin]) {
            iMin = j;
            if (sorting) {
                theDelay();
            }
        }

    if (iMin != i) {
        swap(c, iMin, i);
        if (sorting) {
            theDelay();
        }
    }
}
endTime = System.currentTimeMillis();
overallTime = endTime - startTime;
// System.out.println(overallTime);

theDelay() 方法只是延迟排序算法在其中运行的线程,以便可视化图形可以绘制到 JPanel 以显示正在执行的排序,在此测试用例中它是被忽略所以不会影响我的排序时间。

这是我的合并排序实现:

public void mergeSort(int[] d) throws InterruptedException {
    startTime = System.currentTimeMillis();
    MergeSort(d, 0, d.length - 1);
    endTime = System.currentTimeMillis();
    overallTime = endTime - startTime;
    //System.out.println("Merge" +overallTime);
}

private void MergeSort(int[] array, int low, int high) throws InterruptedException {
    int[] temp = new int[array.length];
    if (low < high) {
        int middle = low + (high - low) / 2;
        MergeSort(array, low, middle);
        MergeSort(array, middle + 1, high);
        ReMerge(array, temp, low, middle, high);
    }
}

private void ReMerge(int[] array2, int[] temp, int low, int middle, int high) throws InterruptedException {
    for (int i = low; i <= high; i++) {
        temp[i] = array2[i];
    }
    int i = low;
    int j = middle + 1;
    int k = low;

    while (i <= middle && j <= high) {
        if (temp[i] <= temp[j]) {
            array2[k] = temp[i];
            i++;
            if (sorting) {
                theDelay();
            }
        } else {
            array2[k] = temp[j];
            j++;
            if (sorting) {
                theDelay();
            }
        }
        k++;
    }
    while (i <= middle) {
        array2[k] = temp[i];
        k++;
        i++;
        if (sorting) {
            theDelay();
        }
    }
}

我的实现中是否有什么东西影响完成合并排序所需的时间???

最佳答案

你有:

private void MergeSort(int[] array, int low, int high) throws InterruptedException
{
    int[] temp = new int[array.length];

当然,在递归的每一步分配长度为 500050000 的数组会使算法变慢。尝试重复使用相同的临时数组。

关于java - 合并排序与选择排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323563/

相关文章:

python - 如何对齐两个数字列表

java - 缩小数字的好方法

java - 寻找有关 trie 的良好介绍

algorithm - 如何在 Ada 中进行快速排序

javascript - 仅对数组的部分内容进行排序

ruby-on-rails - 有没有办法强制 Rails 中的测试顺序?

java - 带有接口(interface)的枚举 - 一般如何做?

java - 多个按钮,每个按钮选择不同的 Activity

java - 了解 Java 中的循环不变量

java - 使用 HTTPUrlConnection 的 RESTful 请求