#8. Сортировка выбором | Алгоритмы на Python

Sdílet
Vložit
  • čas přidán 27. 02. 2021
  • Рассказывается об одном очень популярном алгоритме сортировки - сортировки выбором. Приведен пример его реализации на Python.
    algorithm-sort-select.py: github.com/selfedu-rus/python...

Komentáře • 56

  • @Vanya1977
    @Vanya1977 Před 2 lety +47

    Спасибо за хорошее объяснение, но в python обмен значениями можно делать не использую 3-ю переменную t. Строки 17-19 можно заменить на a[i], a[p] = a[p], a[i]
    Хотя короткая версия имела бы такой алгоритм, не прибегая к дополнительным переменным
    for i in range(n-1):
    for j in range(i+1, n):
    if a[i] > a[j]:
    a[i], a[j] = a[j], a[i]

    • @selfedu_rus
      @selfedu_rus  Před 2 lety +7

      да, все верно, ваш вариант куда лучше, спасибо!

    • @tedi145
      @tedi145 Před 2 lety

      Сижу ничего и понять не могу как бл оно работает(тупица походу)как только вижу твой вариант увидел сразу все понял (сижу офигеваю сам с себя)

    • @FEOD0R
      @FEOD0R Před 2 lety +6

      В вашей версии реализован алгоритм

    • @lokusok5080
      @lokusok5080 Před rokem

      @@FEOD0R
      Сортировка пузырьком была бы такой:
      N = len(a)
      for j in range(1, N):
      for i in range(N-j):
      if a[i] > a[i+1]:
      a[i], a[i+1] = a[i+1], a[i]

    • @alexandreabramtsev9160
      @alexandreabramtsev9160 Před rokem

      кроме как визуального эффекти ничего так не экономится. Операция a, b = b, a использует для обмена 2 переменных, вместо предложенной версии автора одной. Просто эти переменные неименованные, да и еще собраны в 3-ю переменную - кортеж Так вот - сначала создается котреж, а потом он распаковывается - процессорно тут куда намного больше телодвижений. Хотя визуально обмен значений через кортеж выглядит красивее

  • @user-no5hc7eo8t
    @user-no5hc7eo8t Před 11 měsíci +2

    Спасибо, большое за ваше подробное объяснение, посмотрел несколько видео нечего не понял( Открыл Ваше, увидел первые 1:25 и сразу все дошло! ))

  • @squalogender
    @squalogender Před 2 lety +1

    спасибо! все понятно объясняете

  • @friend1cat
    @friend1cat Před 3 lety +2

    Спасибо, Сергей.

  • @user-vq2if9up5u
    @user-vq2if9up5u Před rokem +1

    спасибо за ваши видео

  • @user-yp6yv2ub2u
    @user-yp6yv2ub2u Před rokem +1

    Сергей, спасибо.

  • @tsunamicross1061
    @tsunamicross1061 Před 9 měsíci +1

    спасибо огромное, помогли разобраться!

  • @suiorarashbek
    @suiorarashbek Před rokem +1

    лучшей сделай курс или по алгоритмам или продолжающий python , я бы с удовольствием училсябы у тебя.. спасибо за видео. ты крут чувак..

  • @user-ep8mj5dd4c
    @user-ep8mj5dd4c Před 2 lety +2

    Здравствуйте пожалуйста снимите видео про двумерные массивы и сортировку. в интернете вообще мало информации. очень интересно и полезно! одномерные поняла теперь двумерные надо понять! Или хотябы общие алгоритмы как изменятся

  • @vovadun
    @vovadun Před rokem +1

    Я чего то не понял или на видео переменной t присваивается j-й элемент, а в реализации кода i-й ?

  • @never_sleep-r8l
    @never_sleep-r8l Před 2 lety +21

    В блоке обмена значениями проверка if излишняя. И это, бро, ты бы называл переменные понятно, например temp_value и temp_index, а то я коло часа медитировал над кодом, что бы разобраться что к чему. А так спасибо за разбор

    • @andyabsent4648
      @andyabsent4648 Před 2 měsíci

      все там правильно со вторым ифом, во избежание лишних замен, другой вопрос что можно было упростить код не используя такого кол-ва переменных во всех ифах и в первом ифе переопределять только указатели.

  • @ranli4998
    @ranli4998 Před rokem +2

    А если я допустим хочу с 5-го элемента по 9-ый в порядке возрастания сделать, как это написать?

  • @vyacheslavs5642
    @vyacheslavs5642 Před 2 lety +10

    Можно ещё добавить про сложность алгоритма. И сказать пару слов про О-большое и как оно определяется

    • @user-ee1lx1pe7n
      @user-ee1lx1pe7n Před 2 lety

      Сложность данного алгоритма: O(n^2)

  • @CCblLKA
    @CCblLKA Před rokem

    Какой алгоритм нахождения самого минимального j?

  • @alexd3596
    @alexd3596 Před rokem +5

    Не понятно зачем здесь заводить переменную m, каждый раз ей присваивать значение a[i] и сравнивать ? Лишняя операция. Если можно сразу писать: if a[i] > a[j]: ….

  • @user-bw4xg8tb9r
    @user-bw4xg8tb9r Před 2 lety +3

    Сергей, реализация программы из книги "Грокаем алгоритмы" в два раза быстрее по скорости, почему не использовали её в данном уроке?

    • @selfedu_rus
      @selfedu_rus  Před 2 lety +1

      Здесь учебная реализация. И кроме того эту книгу я не читал ) Надо будет посмотреть. Спасибо!

    • @user-bw4xg8tb9r
      @user-bw4xg8tb9r Před 2 lety +1

      @@selfedu_rus да, посмотрите. Забавное пособие)) Но, к сожалению, там не так много алгоритмов разбирается, и они не самые сложные

    • @selfedu_rus
      @selfedu_rus  Před 2 lety

      @@user-bw4xg8tb9r спасибо, уже скачал )

    • @user-bw4xg8tb9r
      @user-bw4xg8tb9r Před 2 lety +1

      @@selfedu_rus вам спасибо за уроки)

  • @Stanis_LOVE
    @Stanis_LOVE Před rokem +1

    получается что даже последний условный оператор выполняет 3 действия которые можно было показать одним множественным присваиванием > a[p], a[i] = a[i], a[p]. Есть ли у этого метода какие то плюсы по сравнению с пузырьком? С первого взгляда это кажется усложнением пузырька, но я возможно чего то не понимаю еще.

    • @selfedu_rus
      @selfedu_rus  Před rokem +1

      в общем, одно и то же, вычислительная сложность O(n^2) - медленный алгоритм

  • @user-ww1ur8ww8r
    @user-ww1ur8ww8r Před rokem +2

    a = [-3,5,0,-8,1,10]
    for i in range (len(a)-1):
    for j in range (i+1, len(a)):
    if a[i] > a[j]:
    a[i], a [j] = a[j], a[i]
    print(a)
    Можно проще решить

    • @nekiyzzz9656
      @nekiyzzz9656 Před rokem

      Но это не сортировка выбором, а пузырьковая

  • @firi4737
    @firi4737 Před 3 lety +1

    А сам sort в питоне как сортирует?

    • @selfedu_rus
      @selfedu_rus  Před 3 lety +2

      Определенно реализован один из быстрых алгоритмов, но какой именно не скажу.

    • @higherupanddown8642
      @higherupanddown8642 Před 2 lety +2

      Timsort

  • @isok.atyrau
    @isok.atyrau Před 3 lety +1

    А обмен значение можно делать без временный переменные???

    • @selfedu_rus
      @selfedu_rus  Před 3 lety

      Нет, нужна одна или две переменные.

    • @MuratAstrakhan
      @MuratAstrakhan Před 3 lety +2

      Можно. i, j = j, i

    • @MuratAstrakhan
      @MuratAstrakhan Před 3 lety

      @@suddenname нет там никаких скрытых переменных

    • @selfedu_rus
      @selfedu_rus  Před 3 lety

      @@MuratAstrakhan Это и есть через две временные переменные

    • @datorikai9911
      @datorikai9911 Před 3 lety

      @@suddenname super

  • @user-go2zu3zx7n
    @user-go2zu3zx7n Před 4 měsíci +1

    вот самое обидное. Я прекрасно понимаю логику проведения. Но, блин, не могу понять, как это описано... Вот вообще...

  • @higherupanddown8642
    @higherupanddown8642 Před 2 lety +1

    Реализация программы плохая, но хорошее объяснение общего принципа

    • @selfedu_rus
      @selfedu_rus  Před 2 lety +1

      я все расписал в учебных целях, не более того

  • @mao13132
    @mao13132 Před 11 měsíci

    Почему данный алгоритм не сортирует если есть дубли? a = [10, 21, 1, -10, 10, 0, -2]

    • @selfedu_rus
      @selfedu_rus  Před 11 měsíci +1

      отсортировал, получилось: [-10, -2, 0, 1, 10, 10, 21]

    • @mao13132
      @mao13132 Před 11 měsíci

      Разобрался. блок с последним if сдвинул и он зашёл в зону видимость цикла. Спасибо!

  • @ez9723
    @ez9723 Před 5 měsíci +1

    def s_sort(a):
    i = 0
    j = 1
    while j < len(a):
    element_index = a[j: len(a)].index(min(a[j: len(a)])) + j
    if a[element_index] < a[i]:
    a[i], a[element_index] = a[element_index], a[i]
    i += 1
    j += 1
    return a
    Вот моя реализация с использованием срезов и встроенной функции min

  • @falcon4687
    @falcon4687 Před 3 měsíci

    Говнокод если честно

  • @qmv774
    @qmv774 Před 3 měsíci +2

    Код на Rust:
    fn selection_sort(arr: &mut [i32]) {
    let len = arr.len();
    for i in 0..len {
    let mut min_index = i;
    for j in (i + 1)..len {
    if arr[j] < arr[min_index] {
    min_index = j;
    }
    }
    if i != min_index {
    arr.swap(i,min_index);
    }
    }
    }
    fn main() {
    let mut arr = [-3,5,0,-8,1,10];
    selection_sort(&mut arr);
    arr.iter().for_each(|x| println!("{x}"));
    }