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

排序算法:选择排序,分别用c++、java、python实现

选择排序介绍

选择排序(Selection Sort)是一种简单的比较排序算法,它的工作原理如下:

  1. 分区: 将待排序的数组分成两个部分,一个部分是已排序的子数组,另一个部分是未排序的子数组。初始时,已排序的子数组为空,而未排序的子数组包含整个数组。

  2. 选择最小值: 从未排序的子数组中找到最小(或最大,根据排序顺序而定)的元素。

  3. 交换: 将找到的最小值与未排序子数组的第一个元素交换,将其放入已排序的子数组的末尾。

  4. 重复: 重复上述步骤,依次选择未排序子数组中的下一个最小值,放入已排序的子数组中,直到未排序子数组为空。

  5. 完成: 当未排序子数组为空时,整个数组已经排序完成。

选择排序的特点:

  • 它的实现非常简单,容易理解。
  • 它的时间复杂度为O(n^2),其中n是待排序数组的长度,这使得它在大型数据集上的性能相对较差。
  • 由于它交换的次数相对较少,所以在某些情况下,它可能比其他简单排序算法(如冒泡排序)略快。

虽然选择排序在实际应用中不如高级排序算法(如快速排序或归并排序)高效,但它在理解排序算法的工作原理时很有用,通常用于教学或小型数据集的排序。

与其他排序算法比较

下面是对选择排序、冒泡排序、快速排序和归并排序的比较,使用表格形式呈现:

排序算法平均时间复杂度最坏情况时间复杂度稳定性额外空间主要优点主要缺点
选择排序O(n^2)O(n^2)不稳定,相同元素的相对位置可能会改变O(1)简单易懂,适用于小型数据集性能较差,不适用于大型数据集
冒泡排序O(n^2)O(n^2)稳定,相同元素的相对位置不会改变O(1)简单易懂,适用于小型数据集性能较差,不适用于大型数据集
快速排序O(n*log(n))O(n^2)不稳定,相同元素的相对位置可能会改变O(log(n))平均情况下性能优秀,适用于大型数据集最坏情况下性能较差
归并排序O(n*log(n))O(n*log(n))稳定 ,相同元素的相对位置不会改变O(n)稳定且性能稳定,适用于大型数据集需要额外空间,递归实现可能占用栈空间

c++实现

#include<iostream>
using namespace std;const int MAXN=10001;
int main(){int n=8,k,i,j;float temp,a[MAXN];a[1]=10;a[2]=6;a[3]=7;a[4]=1;a[5]=2;a[6]=16;a[7]=18,a[8]=9;for(i=1;i<=n;i++){k=i;for(j=i+1;j<=n;j++){if(a[j]<a[k]){k=j;}}if(k!=i){temp = a[i];a[i] = a[k];a[k]=temp;}}for(i=1;i<=n;i++){cout<<a[i]<<" ";}return 0;
}

java实现

public class SelectionSort {public static void selectionSort(float[] 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;}}if (minIndex != i) {float temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}}public static void main(String[] args) {float[] a = {10, 6, 7, 1, 2, 16, 18, 9};selectionSort(a);for (float num : a) {System.out.print(num + " ");}}
}

python 实现

def selection_sort(arr):n = len(arr)for i in range(n):min_index = ifor j in range(i + 1, n):if arr[j] < arr[min_index]:min_index = jif min_index != i:arr[i], arr[min_index] = arr[min_index], arr[i]return arrif __name__ == "__main__":a = [10, 6, 7, 1, 2, 16, 18, 9]sorted_a = selection_sort(a)print(sorted_a)
http://www.lryc.cn/news/206891.html

相关文章:

  • 支付宝支付接入流程
  • 管理员|顾问必看!8个Salesforce权限集的最佳实践
  • 【linux进程(六)】环境变量再理解程序地址空间初认识
  • 10步开启SAFe敏捷发布列车
  • 面试题之Vue和React的区别是什么?
  • Linux基础知识——概述和常用文件管理命令
  • 腾讯云创建了jenkins容器,但无法访问
  • C语言的const函数修饰指针
  • EasyExcel使用方式(包含导出图片)
  • redis学习(三)——java整合redis
  • OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程
  • 【vue】vue前端、生产(线上)环境请求unicloud云服务空间axios报错
  • JVM详解(InsCode AI 创作助手)
  • 华为c语言编程规范
  • SQL Server Management Studio (SSMS)的安装教程
  • React 图片瀑布流
  • C++数据结构X篇_21_插入排序(稳定的排序)
  • 【Unity】3D跑酷游戏
  • bp前端验证码绕过及token绕过
  • Jmeter(十四):跨线程组传递jmeter变量及cookie的处理详解
  • css实现圆形进度条
  • 适用于 Windows 10 和 Windows 11 设备的笔记本电脑管理软件
  • YOLOv5论文作图教程(1)— 软件介绍及下载安装(包括软件包+下载安装详细步骤)
  • AutoCAD 2024 Mac中文附激活补丁 兼容M1.M2电脑
  • Jmeter基础---while控制器举例说明
  • 正点原子嵌入式linux驱动开发——RGB转HDMI
  • 前端时间分片渲染
  • 亿图导出word和PDF中清晰度保留方法
  • chatGPT结构及商业级相似模型应用调研
  • HarmonyOS鸿蒙原生应用开发设计- 华为分享图标