2013-03-01 4 views
0

Я хотел бы, чтобы преобразовать следующий JAVA код для питона (я новичок в Python)Python: Выбор Сортировка

public void selectionSort(int[] arr) { 
     int i, j, minIndex, tmp; 
     int n = arr.length; 
     for (i = 0; i < n - 1; i++) { 
      minIndex = i; 
      for (j = i + 1; j < n; j++) 
        if (arr[j] < arr[minIndex]) 
         minIndex = j; 
      if (minIndex != i) { 
        tmp = arr[i]; 
        arr[i] = arr[minIndex]; 
        arr[minIndex] = tmp; 
      } 
     } 
} 

Это то, что я написал, но он не работает, и я не могу понять, что я Я делаю неправильно

A = [86, 2,4 ,5, 6122, 87] 

def selectionSort(a): 
    n = len(a) 
    print ("n = ", n) 
    for i in range (0, n-1): 
     minIndex = i 
     j = i+1 
     for j in range (0, n): 
      if(a[j] < a[minIndex]): 
       minIndex = j 
     if minIndex != i: 
      tmp = a[i] 
      a[i] = a[minIndex] 
      a[minIndex] = tmp 



selectionSort(A) 
print(A) 

Пожалуйста, помогите мне понять, почему

+1

Почему? Python не является java. Использовать 'A.sort()' –

+0

Для чего предназначен 'j = i + 1'? Сразу же после его назначения вы переписываете его с помощью 0. – geoffspear

+2

@Fredrik Если ОП учится программировать и изучать питон, это может быть хорошим упражнением. – Bakuriu

ответ

0
for j in range (0, n) 

не то же самое, как и в Java, где используется I + 1 т o начало.

Более вещий способ осуществить выбор рода может выглядеть следующим образом:

A = [86, 2,4 ,5, 6122, 87] 
def selectionSort(a): 
    # Go through all positions except the last one 
    # (that one will automatically be correct) 
    for index in range(len(a)-1): 
     value = a[index] 
     # enumerate all (index, value) pairs from the rest of the list 
     # and take the pair with the smallest value 
     min_subindex, min_value = min(enumerate(a[index+1:]), key=lambda x: x[1]) 
     if min_value < value: 
      a[index] = min_value 
      a[min_subindex + index + 1] = value 

selectionSort(A) 
print(A) # [2, 4, 5, 86, 87, 6122] 
+0

перечисляет форму списка кортежей, но почему требуется [index + 1]: как аргумент? –

+0

'some_list [x: y: z]' - это сортировка списка, объясненная в [этом вопросе StackOverflow] (http://stackoverflow.com/questions/509211/the-python-slice-notation). Идея состоит лишь в перечислении остальной части списка. – mensi

+0

min_subindex будет иметь то же значение, что и min_value? –

2

Изменить две линии

j = i+1 
for j in range (0, n): 

к

for j in range (i+1, n): 

соответствовать

for (j = i + 1; j < n; j++) 

другие nitpicks

свапирования в питона элегантно сделано как

a[i], a[minIndex] = a[minIndex], a[i] 

и весь блок

minIndex = i 
    for j in range (i+1, n): 
     if(a[j] < a[minIndex]): 
      minIndex = j 
    if minIndex != i: 
     a[i], a[minIndex] = a[minIndex], a[i] 

может быть переработан в

minIndex = min(range(i,n), key = partial(getitem, a)) 
    a[i], a[minIndex] = a[minIndex], a[i] 

при условии импорта partial from functools и getitem from operator

from functools import partial 
from operator import getitem 

Так что ваш окончательный вариант будет выглядеть как

from functools import partial 
from operator import getitem 
def selectionSort(a): 
    n = len(a) 
    for i in range (n-1): 
     minIndex = min(range(i,n), key = partial(getitem, a)) 
     a[i], a[minIndex] = a[minIndex], a[i] 

видения, которые в конце концов сделает вам интересно, если преобразовать код Java в Python, как это упражнение действительно хороший способ узнать Python

+0

Ваша окончательная версия неверна, поскольку вы меняете безоговорочно. Я получаю '[2, 4, 5, 87, 86, 6122]' с вашим кодом – mensi

+0

@mensi: Наоборот, обмен может быть безусловным, но проблема была связана с индексом диапазона, это должно было быть 'i 'вместо' i + 1' – Abhijit

0

Вопросы:

  1. W Куда вы делаете j in range(0, n-1), он начнет цикл в 0 вместо i+1.

Использование

for j in range(i+1, n-1) 

Рабочий код:

A = [86, 2,4 ,5, 6122, 87] 

def selectionSort(a): 
    n = len(a) 
    print ("n = ", n) 
    for i in range (0, n-1): 
     minIndex = i 
     for j in range (i+1, n): 
      if(a[j] < a[minIndex]): 
       minIndex = j 

     if minIndex != i: 
      a[i], a[minIndex] = a[minIndex], a[i] 

selectionSort(A) 
print(A) 
+0

Thank you SO MUCHHH !!!! вы были правы, он начал зацикливаться на 0, и все перепуталось –

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