首页 > 编程语言 >深入了解选择排序算法

深入了解选择排序算法

时间:2023-09-11 12:32:55浏览次数:79  
标签:minIndex arr int 选择 算法 深入 数组 排序

在计算机科学中,排序是一个基本而重要的问题。排序算法有许多种,其中之一是选择排序(Selection Sort)。本文将深入介绍选择排序的工作原理,讨论其时间复杂度,以及提供Python、Go、Java和C语言的示例代码。

选择排序的基本思想

选择排序是一种比较排序算法,其基本思想是将数组分为已排序和未排序两部分。在每一次迭代中,从未排序部分中选择最小(或最大)的元素,将其放入已排序部分的末尾。这个过程不断迭代,直到整个数组都有序。

为了更好地理解选择排序,让我们通过一个简单的示例来演示其工作原理。假设我们有一个整数数组 [5, 2, 9, 3, 4],我们希望按升序排序它。

  1. 第一次选择: 初始时,整个数组都被视为未排序部分。我们找到未排序部分中的最小元素 2,然后将其与已排序部分的末尾交换。数组变为 [2, 5, 9, 3, 4],已排序部分为 2,未排序部分为 [5, 9, 3, 4]
  2. 第二次选择: 现在,我们在未排序部分 [5, 9, 3, 4] 中找到最小元素 3,将其与已排序部分的末尾交换。数组变为 [2, 3, 9, 5, 4],已排序部分为 2, 3,未排序部分为 [9, 5, 4]
  3. 第三次选择: 继续这个过程,我们找到未排序部分中的最小元素 4,将其与已排序部分的末尾交换。数组变为 [2, 3, 4, 5, 9],已排序部分为 2, 3, 4,未排序部分为 [5, 9]
  4. 完成排序: 最后,未排序部分只剩下两个元素 [5, 9],我们将它们依次加入已排序部分,得到完全有序的数组 [2, 3, 4, 5, 9]

这个过程不断迭代,每一次迭代都会将未排序部分中的最小元素添加到已排序部分,最终得到完全有序的数组。

选择排序的时间复杂度

选择排序的时间复杂度在任何情况下都为O(n^2),其中n是数组的长度。这是因为在每一次迭代中,都需要在未排序部分中查找最小元素,这需要进行n次比较。虽然选择排序的时间复杂度较高,但它的优点是不需要额外的内存空间,是一种稳定的排序算法。

选择排序的应用场景

尽管选择排序不是最高效的排序算法,但它在某些情况下仍然有用:

  1. 小型数据集: 在处理小型数据集时,选择排序可能比其他复杂的排序算法更具可读性和实现简单性。
  2. 内存有限的情况: 选择排序不需要额外的内存空间,适用于内存有限的环境。
  3. 对稳定性有要求: 选择排序是一种稳定的排序算法,可以保持相同元素的相对位置。

示例代码

以下是选择排序的示例代码,分别使用Python、Go、Java和C语言编写。

Python 选择排序

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_index = i
        for j in range(i+1, n):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]

arr = [5, 2, 9, 3, 4]
selection_sort(arr)
print("排序后的数组:", arr)

Go 选择排序

package main

import "fmt"

func selectionSort(arr []int) {
    n := len(arr)
    for i := 0; i < n; i++ {
        minIndex := i
        for j := i + 1; j < n; j++ {
            if arr[j] < arr[minIndex] {
                minIndex = j
            }
        }
        arr[i], arr[minIndex] = arr[minIndex], arr[i]
    }
}

func main() {
    arr := []int{5, 2, 9, 3, 4}
    selectionSort(arr)
    fmt.Println("排序后的数组:", arr)
}

Java 选择排序

public class SelectionSort {
    public static void selectionSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 9, 3, 4};
        selectionSort(arr);
        System.out.print("排序后的数组: ");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

C 语言 选择排序

#include <stdio.h>

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

int main() {
    int arr[] = {5, 2, 9, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    selectionSort(arr, n);
    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

这些示例代码演示了选择排序的工作原理,并提供了Python、Go、Java和C语言的不同语言版本的实现。选择排序是一种简单但不够高效的排序算法,通常在处理小型数据集或对稳定性要求较高的情况下使用。

标签:minIndex,arr,int,选择,算法,深入,数组,排序
From: https://blog.51cto.com/u_16170163/7434858

相关文章

  • 《落实算法安全主体责任基本情况》范文,修改主体即可提交2
    在数字化时代,算法已经成为了商业竞争和创新的关键要素。然而,算法的广泛应用也引发了对其安全性和合规性的关切。《落实算法安全主体责任基本情况》作为算法备案过程中的一环,具有极高的专业性,需要企业全面考虑算法的隐私保护、数据合规、风险预防等一系列关键问题。正因如此,许多......
  • 【目标检测】RCNN算法实现
    一、前言RCNN(RegionswithCNNfeatures)算法由RossGirshick在2014年的论文“Richfeaturehierarchiesforaccurateobjectdetectionandsemanticsegmentation”提出,是深度学习目标检测的开山之作。RCNN将CNN应用到目标检测问题上,它使用选择性搜索从图像中提取候选区域,利用......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • PostgreSQL数据库从入门到精通系列之五:深入理解lsn_proc、lsn_commit、lsn、txId、ts_
    PostgreSQL数据库从入门到精通系列之五:深入理解lsn_proc、lsn_commit、lsn、txId、ts_usec一、深入理解lsn_proc二、深入理解lsn_commit三、深入理解lsn四、深入理解txId五、深入理解ts_usec一、深入理解lsn_proc在PostgreSQL中,lsn_proc是一个内置函数,用于将逻辑日志位置(LSN)转换......
  • PostgreSQL数据库从入门到精通系列之六:深入理解逻辑复制槽,创建逻辑复制槽,删除逻辑复制
    PostgreSQL数据库从入门到精通系列之六:深入理解逻辑复制槽,创建逻辑复制槽,删除逻辑复制槽一、逻辑复制槽二、创建逻辑复制槽三、删除逻辑复制槽一、逻辑复制槽在PostgreSQL中,逻辑复制槽是一种用于实现逻辑复制的功能。逻辑复制槽允许将源数据库的更改流式传输到目标数据库,并使目标......
  • Mysql数据库系列之:深入理解tinyint(n)
    Mysql数据库系列之:深入理解tinyintn一、深入理解tinyint(n)二、创建包含tinyint类型字段的表三、扩展一、深入理解tinyint(n)对于MySQL中的tinyint列,"(n)"没有任何实际意义。在MySQL中,tinyint的宽度始终为1字节,所以在定义表时指定tinyint(n)与tinyint相同。在MySQL中,tinyint字段......
  • 例2.6 设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂
    1.题目例2.6设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂度为0(1)。2.算法思想3.代码voidDeleteX(SeqListLA,SeqList*LC,intx){inti=0,j=0;while(i<=LA.last){if(LA.element[i]==x)i++;else......
  • MySQL基础篇:掌握MySQL数据排序,让你的数据分析事半功倍
    单一字段排序排序采用orderby子句,orderby后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,orderby默认采用升序,如果存在where子句那么orderby必须放到where语句的后面按照薪水由小到大排序(系统默认由小到大)mysql>select*fromEMPorderbySAL;+-------+--------+---......
  • 并查集 堆排序 (9/10)
    并查集模板 注意查找到后查找的节点直接连接根节点#include<iostream>usingnamespacestd;constintN=100010;intp[N];//关键记住find函数intfind(inta){if(p[a]!=a)p[a]=find(p[a]);//不等于根节点就往头结点走,并且等于returnp[a];}intma......
  • 机器学习算法原理实现——神经网络反向传播,链式求导核心
    记得先看之前的梯度下降文章!   链式求导的核心来了,就高中数学知识: 代码实现:importnumpyasnpimportmatplotlib.pyplotasplt#Sigmoid激活函数及其导数defsigmoid(z):return1/(1+np.exp(-z))defsigmoid_derivative(z):returnsigmoid(......