Почему Merge функции сортировки сливается () имеет условный второй цикл?

голоса
1
merge1(int low, int high, int S[], U[]) 
{ 
    int k = (high - low + 1)/2
    for q (from low to high) U[q] = S[q]
    int j = low 
    int p = low 
    int i = low + k 

    while (j <= low + k - 1) and (i <= high) do 
    { 
        if ( U[j] <= U[i] ) 
        {
            S[p] := U[j] 
            j := j+1
        } 
        else 
        { 
            S[p] := U[i] 
            i := i+1 
        } 
        p := p+1 
    } 

    if (j <= low + k - 1) 
    { 
        for q from p to high do 
        { 
            S[q] := U[j] 
            j := j+1 
        } 
    }
}


merge_sort1(int low, int high, int S[], U[]) 
{ 
    if low < high 
    { 
        int k := (high - low + 1)/2 
        merge_sort1(low, low+k-1, S, U) 
        merge_sort1(low+k, high, S, U) 
        merge1(low, high, S, U) 
    } 
}

Таким образом, в основном, это на моих конспектах. Я нахожу это довольно запутанным в целом, но я понимаю большую часть этого. То, что я не понимаю, это потребность «если (J <= низкая + к - 1)» часть. Похоже, он проверяет, есть ли какие-либо элементы «левые» в левой части. Это даже возможно, когда mergesorting?

Задан 24/04/2010 в 00:28
источник пользователем
На других языках...                            


1 ответов

голоса
2

При объединении двух отсортированных списков (назовем их leftи right), вы продолжаете принимать один пункт и добавить его в resultсписок, пока не кончатся пунктов либо в leftили rightсписке. Это делается с помощью первой whileпетли. Теперь вам нужно добавить элементы , оставшиеся в левом или правом списке в список результатов. Есть два варианта:

  • Левый список из элементов, а правый список все еще имеет некоторые. То , как код написан здесь, нам не нужно ничего делать, так как конец Sмассива уже содержит последние элементы в rightсписке.

  • Правильный список из элементов, а левый список все еще имеет некоторые. Затем мы копируем остальные элементы до конца S. Это то , что ifв конце merge1делает.


Что касается вашего вопроса, если этот код «плохо»: код правильный, но я хотел бы сделать некоторые изменения, чтобы сделать его более удобным для чтения:

  • Описательные имена переменных.
  • Передача середины , которая разделяет leftи rightсписки merge1вместо того , она пересчитывается.
Ответил 24/04/2010 в 00:45
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more