2016-08-11 12 views
1

У меня есть этот код python ниже (для сортировки пузыря). Ниже я попытался преобразовать его в код MATLAB. Я новичок в MATLAB, и я делаю конверсию для практики. Я был бы признателен за отзыв о том, насколько точным/неправильным является мое преобразование.Преобразование Python в Matlab?

версия питона:

def bubble_sort(alist): 
    return bubble_sort_helper(alist, len(alist)) 
def bubble_sort_helper(alist, n): 
    if n < 2: 
     return alist 
    for i in range(len(alist)-1): 
     if alist[i] > alist[i+1]: 
      temp = alist[i] 
      alist[i] = alist[i+1] 
      alist[i+1] = temp 
    return bubble_sort_helper(alist, n-1) 

Моя попытка преобразования MATLAB:

function a = bubble_sort(alist) 
    a = bubble_sort_helper(alist, size(alist)) 
end 

function b = bubble_sort_helper(alist, n) 
    if n < 2 
     b = alist 
    end 
    for ii = size(alist) 
     if alist(1) > alist (ii+1) 
      temp = alist(ii) 
      alist(ii) = alist(ii+1) 
      alist(ii+1) = temp 
     end 
    end 
    b = bubble_sort_helper(alistn n-1) 

end 
+0

Я забыл добавить отступы под если заявление для кода питона. Исправлена ​​ошибка с моей правкой. –

+2

Вы проверили, не отсортировали ли ваш вход? – Suever

+0

1) Работает ли он так, как ожидалось? 2) Почему это рекурсивно? –

ответ

2

Несколько вопросов здесь:

  1. Вы должны использовать numel, а не size к получить количество элементов в массиве. size даст вам вектор размеров каждого измерения и numel даст вам общее количество элементов

  2. Вы должны фактически создать массив значений для for петли к проходной. Для этого используйте двоеточие, чтобы создать массив от 2 до n.

    for ii = 2:n 
    end 
    
  3. Вы используете ii в качестве петлевого переменной, но попытаться использовать i внутри цикла. Выберите один и придерживайтесь его (желательно не i)

  4. Чтобы перевернуть значения, вы можете просто сделать ваше задание так:

    alist([i-1, i]) = alist([i, i-1]); 
    

Взятые вместе, это даст вам что-то вроде этого:

function a = bubble_sort(alist) 
    a = bubble_sort_helper(alist, numel(alist)) 
end 

function b = bubble_sort_helper(alist, n) 
    if n < 2 
     b = alist; 
    else 
     for k = 2:n 
      if alist(k-1) > alist(k) 
       alist([k-1, k]) = alist([k, k-1]); 
      end 
     end 
     b = bubble_sort_helper(alist, n-1); 
    end 
end 
+0

Это очень информативно, спасибо. –

1

Ваш питон версия неэффективна:

def bubble_sort(alist): 
    return bubble_sort_helper(alist, len(alist)) 
def bubble_sort_helper(alist, n): 
    if n < 2: 
     return alist 
    for i in range(n-1): 
     if alist[i] > alist[i+1]: 
      alist[i], alist[i+1] = alist[i+1], alist[i] 
    return bubble_sort_helper(alist, n-1) 

и ваш код MATLAB неправильно:

function a = bubble_sort(alist) 
    a = bubble_sort_helper(alist, size(alist)) 
end 

function b = bubble_sort_helper(alist, n) 
    if n < 2 
     b = alist; 
    else 
     for i = 2:n 
      if alist(i-1) > alist(i) 
       temp = alist(i-1); 
       alist(i-1) = alist(i); 
       alist(i) = temp; 
      end 
     end 
     b = bubble_sort_helper(alist, n-1); 
    end 
end 
+0

О, спасибо за отзыв о моей неэффективности. Я пытаюсь узнать все, что могу, о сортировке алгоритмов, поэтому каждый бит помогает. –

Смежные вопросы