当前位置: 首页 > article >正文

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法

选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
在这里插入图片描述

以下是用 Java 实现的选择排序代码示例:

public class SelectionSort {
    public static void selectionSort(int[] array) {
        int n = array.length;
        for (int i = 0; i < n - 1; i++) {
            // 找到未排序部分的最小元素的索引
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            // 交换最小元素和当前位置的元素
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
    }
    public static void main(String[] args) {
        int[] array = {64, 34, 25, 12, 22, 11, 90};
        selectionSort(array);
        System.out.println("排序后的数组:");
        for (int i : array) {
            System.out.print(i + " ");
        }
    }
}

在 Python 中的实现如下:

def selection_sort(alist):
    for i in range(len(alist)-1):
        max_index=i
        for j in range(i+1,len(alist)):
            if alist[j]>alist[max_index]:
                max_index=j
        alist[max_index],alist[i]=alist[i],alist[max_index]
    return alist

if __name__ == '__main__':
    alist=(449,333,441,555,666,777,888,999,332,222,111)
    print("the init of list is:",alist)
    print("the sorted of list is:",selection_sort(alist))

选择排序算法通过两个嵌套的循环来实现。外层循环控制已排序部分的增长,内层循环用于找到未排序部分的最小(或最大)元素的索引。找到最小(或最大)元素后,将其与未排序部分的第一个元素进行交换,从而逐步将整个序列排序完成。

选择排序算法的时间复杂度为 O(n²),其中 n 是待排序元素的数量。这是因为无论原始数据的排列情况如何,算法都需要进行相同数量的比较和交换操作。空间复杂度为 O(1),因为它只需要有限的额外空间来存储临时变量,而不依赖于输入数据的大小。

选择排序算法虽然简单易懂,但在处理大规模数据时效率较低。在实际应用中,可以根据具体情况选择更高效的排序算法,如快速排序、归并排序等。

选择排序算法思想是什么

选择排序是一种简单直观的排序算法。其基本思想是将待排序的数据分为已排序和未排序两部分。首先在未排序的数列中查找到最小(或最大)元素,然后将其存放到数列的起始位置,此时已排序部分就有了一个元素。接着,再从剩余未排序的元素中继续寻找最小(或最大)的元素,放到已排序序列的末尾。如此重复这个过程,直到所有元素都被排序完毕。

例如,对于数组{20,40,30,10,60,50}第一趟会找到最小元素10,将其与数组第一个元素20交换得到{10,40,30,20,60,50}。第二趟从剩余未排序元素{40,30,20,60,50}中找到最小元素20,与第二个元素40交换,变为{10,20,30,40,60,50}。后面继续这个过程,直到整个数组有序。

选择排序的优点是实现简单,不占用额外的内存空间。缺点是时间复杂度较高,为O(n²),不太适合处理大规模数据。

选择排序算法的 Java 实现代码

以下是选择排序算法的 Java 实现代码:

public class SelectionSort {
    public static void main(String[] args) {
        int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
        arr = selectionSort(arr);
        for (int a : arr) {
            System.out.print(a + ",");
        }
    }

    public static int[] selectionSort(int[] arr) {
        int min,temp;
        for (int i = 0; i < arr.length - 1; i++) {
            min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
        return arr;
    }
}

在这个实现中,外层循环控制当前待排序的位置,内层循环用来找到未排序部分的最小元素的下标。然后将当前待排序位置的元素与最小元素进行交换。通过持续地重复这个过程,直到所有元素都被排序。

选择排序算法的 Python 实现代码

选择排序算法的 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]
    return arr

nums = 
print("待排序的数列:", nums)
sorted_nums = selection_sort(nums)
print("排序后的结果为:", sorted_nums)

这段代码首先定义了一个函数selection_sort,函数接收一个待排序的列表作为参数。在函数内部,通过两个嵌套的循环实现选择排序。外层循环遍历列表的每个位置,内层循环在未排序部分找到最小元素的下标。最后,将当前位置的元素与最小元素进行交换,直到整个列表有序。

选择排序算法时间复杂度是多少

选择排序算法的时间复杂度为 O(n²)。其中 n 是待排序数据的数量。

选择排序的工作方式是每一次从待排序的数据中选择最小(或者最大)的一个元素,放到序列的起始位置,直到全部待排序的元素排完。在每一趟排序中,都需要遍历未排序部分的所有元素来找到最小(或最大)元素,对于一个长度为 n 的数组,第一趟需要比较 n - 1 次,第二趟需要比较 n - 2 次,以此类推。总的比较次数为 (n - 1) + (n - 2) +… + 1,根据等差数列求和公式可得总比较次数为 n(n - 1)/2,近似为 n²/2。当 n 趋向于无穷大时,时间复杂度的量级为 n²,记作 O(n²)。

虽然选择排序的时间复杂度比较高,但是由于其实现简单,所以在数据规模较小时,选择排序仍然是一种较为常用的排序算法。

选择排序算法空间复杂度是多少

选择排序算法的空间复杂度为 O(1)。

选择排序是原地排序算法,它在排序过程中不需要额外的存储空间,只需要几个变量来记录最小元素的下标和进行元素交换时的临时变量。无论待排序数据的规模有多大,所需的额外空间都是固定的,不随输入数据的规模而增长。

总结

选择排序算法思想是每次从未排序部分选择最小(或最大)元素放到已排序部分末尾;Java 和 Python 实现代码通过嵌套循环找到最小元素并进行交换;时间复杂度为 O(n²),不太适合大规模数据排序;空间复杂度为 O(1),是原地排序算法。选择排序在数据规模较小时,因其简单易实现仍有一定的应用价值。


http://www.kler.cn/news/321365.html

相关文章:

  • 进阶SpringBoot之 Dubbo-admin 安装测试
  • Node-GDAL:简洁强大的Node.js地理空间数据处理库
  • 什么是Node.js?
  • ElasticSearch的安装与使用
  • EasyCVR智慧公园视频智能管理方案:赋能公园安全管理新高度
  • Spring中一些常见注解的作用
  • 使用ucharts写的小程序页面柱状图上方没有数字
  • 7款国内AI搜索引擎大全网站
  • 说说海外云手机的自动化功能
  • [Redis][哨兵][上]详细讲解
  • 深入浅出MongoDB(一)
  • 嵌入式C语言自我修养:GNU C编译器扩展语法精讲
  • 利用Puppeteer-Har记录与分析网页抓取中的性能数据
  • TikTok的网络环境搭建指南
  • C++实现二叉树的创建删除,dfslfs,求叶子结点个数,求叶子结点个数,求树的高度
  • D19【python接口自动化学习】-python基础之内置数据类型
  • 矿石运输船数据集、散货船数据集、普通货船数据集、集装箱船数据集、渔船数据集以及客船数据集
  • Web3Auth 如何工作?
  • 相机、镜头参数详解以及相关计算公式
  • 【OceanBase 诊断调优】—— GC问题根因分析
  • centos7 启动mongodb时报错ERROR: child process failed, exited with error number 1
  • electron使用npm install出现下载失败的问题
  • 【HTML】img标签和超链接标签
  • Apache Iceberg 概述
  • ansible playbook多个play多个task
  • ChatGPT高级语音助手正式上线!OpenAI:50多种语言、9种声线可选
  • 磨具生产制造9人共用一台工作站
  • elasticsearch的Ingest Attachment插件的使用总结
  • 数据结构之链表(1),单链表
  • 微服务MongoDB解析部署使用全流程