단순 선택 정렬 애니메이션 데모 애니메이션으로 코드를 시각화하세요

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

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

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

选择排序算法如何工作?

让我们以以下数组为例: 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。 选择排序算法是否到位?

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


시험 합격, 직업 발전, 또는 순수한 관심 등 어떤 목표를 가지고 있든, 이 데이터 구조 및 알고리즘 시각화 웹사이트는 귀중한 자원이 될 것입니다.

이 웹사이트로 이동하여 학습 여정을 시작하세요!

다음은 일반적인 것들입니다: 【C 언어 설명】《데이터 구조와 알고리즘》데이터 구조 JAVA 구현 데이터 구조와 알고리즘 기초 (칭다오 대학 - 왕줘) 데이터 구조와 알고리즘 왕도 데이터 구조 C 언어 구현 속성 데이터 구조 기말고사 전 구급 데이터 구조 비디오 C 언어판 튜토리얼 데이터 구조 옌웨이민 데이터 구조 하오빈 데이터 구조 대학원 시험 JAVA 데이터 구조 알고리즘과 기초 데이터 구조 왕도 2022 데이터 구조 학습 데이터 구조 샤오자위 왕줘 데이터 구조 학습 데이터 구조 저장 대학 데이터 구조 복습 데이터 구조 마사빙 데이터 구조 기초 제로 데이터 구조와 알고리즘 데이터 구조 입문 대학원 시험 데이터 구조 문제 풀이 설명 데이터 구조 기말 복습 컴퓨터 2급