Сортировка слиянием и сортировка по выбору

Я написал эти 2 алгоритма сортировки, и похоже, что сортировка выбора быстрее, чем сортировка слиянием, конечно же, это не может быть правдой? Мои тестовые данные - это 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();
        }
    }
}

есть ли что-то в моей реализации, влияющее на время, необходимое для завершения сортировки слиянием ???


person MichaelStoddart    schedule 04.02.2015    source источник


Ответы (1)


У вас есть:

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

Конечно, выделение массива от 5000 до 50000 на каждом шаге рекурсии сделает алгоритм намного медленнее. Попробуйте повторно использовать тот же временный массив.

person IVlad    schedule 04.02.2015
comment
так что я прав, думая, что слияние должно быть намного быстрее, чем выбор? - person MichaelStoddart; 04.02.2015
comment
@FutureSystemsAnalyst - да, это так. И это должно быть заметно для массивов таких размеров. Ваша реализация здесь виновата, потому что вы делаете много бесполезного распределения памяти. - person IVlad; 04.02.2015