Demonstração Animada de Selection Sort Simples Visualize seu código com animações

图码-数据结构可视化动画版

选择排序 是一种简单而高效的排序算法,其工作原理是重复从列表的未排序部分中选择最小(或最大)元素并将其移动到列表的已排序部分。 

该算法重复从列表的未排序部分中选择最小(或最大)元素,并将其与未排序部分的第一个元素交换。 对剩余的未排序部分重复此过程,直到整个列表排序完毕。 

选择排序算法如何工作?

让我们以以下数组为例: arr[] = {64, 25, 12, 22, 11}

第一遍:

  • 对于排序数组中的第一个位置,从索引 0 到 4 顺序遍历整个数组。 当前存储64 的第一个位置 ,遍历整个数组后很明显 11 是最低值。
  • 因此,将 64 替换为 11。一次迭代后, 11 (恰好是数组中的最小值)往往会出现在排序列表的第一个位置。
选择排序算法 |  将第一个元素与数组中的最小值交换

选择排序算法 | 将第一个元素与数组中的最小值交换

第二遍:

  • 对于存在 25 的第二个位置,再次按顺序遍历数组的其余部分。
  • 遍历完后,我们发现 12 是数组中倒数第二小的值,它应该出现在数组的第二位,因此交换这些值。
选择排序算法 |  将 i=1 与下一个最小元素交换

选择排序算法 | 将 i=1 与下一个最小元素交换

第三遍:

  • 现在,对于第三个位置,其中存在 25, 再次遍历数组的其余部分并找到数组中存在的第三个最小值。
  • 遍历时, 22 是第三个最小值,它应该出现在数组中的第三个位置,因此将 22 与第三个位置上的元素交换。
选择排序算法 |  将 i=3 与下一个最小元素交换

选择排序算法 | 将 i=2 与下一个最小元素交换

第四遍:

  • 类似地,对于第四个位置,遍历数组的其余部分并找到数组中第四小的元素 
  • 由于 25 是第四低的值,因此它将排在第四位。
选择排序算法 |  将 i=3 与下一个最小元素交换

选择排序算法 | 将 i=3 与下一个最小元素交换

第五关:

  • 最后,数组中存在的最大值自动放置在数组的最后一个位置
  • 结果数组是排序后的数组。
选择排序算法 |  需要排序的数组

选择排序算法 | 需要排序的数组

 

下面是上述方法的实现:

C++

// C++ program for implementation of
// selection sort
#include <bits/stdc++.h>
using namespace std;
 
// Function for Selection sort
void selectionSort(int arr[], int n)
{
    int i, j, min_idx;
 
    // One by one move boundary of
    // unsorted subarray
    for (i = 0; i < n - 1; i++) {
 
        // Find the minimum element in
        // unsorted array
        min_idx = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[min_idx])
                min_idx = j;
        }
 
        // Swap the found minimum element
        // with the first element
        if (min_idx != i)
            swap(arr[min_idx], arr[i]);
    }
}
 
// Function to print an array
void printArray(int arr[], int size)
{
    int i;
    for (i = 0; i < size; i++) {
        cout << arr[i] << " ";
        cout << endl;
    }
}
 
// Driver program
int main()
{
    int arr[] = { 64, 25, 12, 22, 11 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    selectionSort(arr, n);
    cout << "Sorted array: \n";
    printArray(arr, n);
    return 0;
}
 
// This is code is contributed by rathbhupendra


            

C

Python3

Java

C#

PHP

JavaScript

输出

排序数组:
11 12 22 25 64

选择排序的复杂度分析

时间复杂度: 选择排序的时间复杂度为 O(N 2 ) ,因为有两个嵌套循环:

  • 一个循环逐一选择 Array 的元素 = O(N)
  • 另一个循环将该元素与每个其他数组元素进行比较 = O(N)
  • 因此总体复杂度 = O(N) * O(N) = O(N*N) = O(N 2 )

辅助空间: O(1),因为在交换数组中的两个值时,唯一使用的额外内存用于临时变量。 选择排序不会进行超过 O(N) 的交换,并且在内存写入成本高昂时非常有用。 

选择排序算法的优点

  • 简单易懂。
  • 适用于小型数据集。

选择排序算法的缺点

  • 在最坏和平均情况下,选择排序的时间复杂度为 O(n^2)。
  • 在大型数据集上效果不佳。
  • 不保留具有相同键的项目的相对顺序,这意味着它不稳定。

选择排序的常见问题

Q1. 选择排序算法稳定吗?

选择排序算法的默认实现并不 稳定 然而,它可以变得稳定。 详细信息 请参阅 稳定的选择排序。

Q2。 选择排序算法是否到位?

是的,选择排序算法是一种就地算法,因为它不需要额外的空间。


Seja seu objetivo o sucesso em exames, o desenvolvimento profissional ou o puro interesse, este site de visualização de estruturas de dados e algoritmos será um recurso inestimável.

Acesse este site e comece sua jornada de aprendizado!

Estes são os comuns: [Descrição em C] Estruturas de Dados e Algoritmos Implementação de Estruturas de Dados em JAVA Fundamentos de Estruturas de Dados e Algoritmos (Universidade de Qingdao - Wang Zhuo) Estruturas de Dados e Algoritmos Caminho Real das Estruturas de Dados Implementação em C das Estruturas de Dados Curso Intensivo de Estruturas de Dados para Salvar a Prova Final Tutorial em Vídeo de Estruturas de Dados em C Versão em C do Livro de Yan Weimin Estruturas de Dados Hao Bin Estruturas de Dados para Pós-Graduação Algoritmos e Fundamentos de Estruturas de Dados em JAVA Caminho Real das Estruturas de Dados 2022 Aprendizado de Estruturas de Dados Pequena Tartaruga das Estruturas de Dados Wang Zhuo Aprendendo Estruturas de Dados Estruturas de Dados da Universidade de Zhejiang Revisão de Estruturas de Dados Soldado Ma das Estruturas de Dados Curso Zero de Estruturas de Dados Estruturas de Dados e Algoritmos Introdução às Estruturas de Dados Explicação de Exercícios de Estruturas de Dados para Pós-Graduação Revisão Final de Estruturas de Dados Nível 2 de Computação