首页 > 编程语言 >排序算法:选择排序,分别用c++、java、python实现

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

时间:2023-10-30 13:01:36浏览次数:31  
标签:index arr java min python int 数组 排序


选择排序介绍

选择排序(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 = i
        for j in range(i + 1, n):
            if arr[j] < arr[min_index]:
                min_index = j

        if min_index != i:
            arr[i], arr[min_index] = arr[min_index], arr[i]

    return arr


if __name__ == "__main__":
    a = [10, 6, 7, 1, 2, 16, 18, 9]
    sorted_a = selection_sort(a)
    print(sorted_a)


标签:index,arr,java,min,python,int,数组,排序
From: https://blog.51cto.com/u_16065421/8087715

相关文章

  • 算法题:分别用c++/python/java实现回文数
    回文数是一个数字,从左到右和从右到左读都是相同的数字序列。换句话说,回文数在数值上是对称的。一些常见的回文数示例包括:单个数字:例如1、2、3等,它们本身就是回文数,因为它们只有一个数字。两位数:例如11、22、33等,它们也是回文数,因为它们的左右两个数字相同。多位数:例如121、1331、12......
  • java.net.SocketException四大异常解决方案
    java.net.SocketException四大异常解决方案java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketException的相关知识。第1个异常是java.net.BindException:Addressalread......
  • Python学习2
    FileOperationsFunction  att=funcName(xx) Ans:Error ......
  • 用Python计算圆周率pi
    一、计算圆周率pi的方法(一)公式法pi=0N=eval(input())forkinrange(N):pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))print(pi)(二)蒙特卡罗方法#e.6.1(p115)fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterDARTS=100000......
  • 【java基础-实战3】list遍历时删除元素的方法
    在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也比较多,那么有哪几种删除元素的方法呢?你用对了吗~本文循序渐进,先说几种容易出问题的方法,再引出几种比较可靠的方法~首先,初始化一个数组,用于后面的事例演示:List<Integer>list=newArrayList<>();......
  • Python 并发编程
    目录一.理论知识1.1多道技术相关2.1同步和异步阻塞和非阻塞二.进程对象编程2.1开启进程的方式2.2join方法2.3进程间数据隔离2.4进程对象其它方法pid2.4守护进程2.5互斥锁2.6进程之间的通信1,队列Queue模块2,ipc机制3,生产者消费者模式三.线程对象编程3.1开启线......
  • Python生成词云
    一、词云生成的基本原理词云是一种可视化展示文本内容的工具,用于显示文本中出现次数较高的关键词。其主要思想是将文本中频繁出现的词汇以视觉化的方式展现出来,可以很快地帮助人们了解文本的主要内容和关键信息。生成词云的基本原理是,首先需要解析文本中的关键词,统计其出现频率,然后......
  • Java技术分享:探索无限可能的编程世界
    作为一门广泛应用于软件开发领域的编程语言,Java在近几十年来一直保持着强大的生命力和广泛的影响力。本文将带您深入探索Java技术的各个方面,并分享一些有关Java编程的实用技巧和最新趋势。Java的优势与特点Java作为一种跨平台、面向对象的编程语言,具有许多独特的优势。首先,它的可......
  • Python常用模块-20个常用模块总结
    目录time模块datetime模块random模块os模块sys模块json和pickle模块hashlib和hmac模块logging模块numpy模块pandas模块matplotlib模块re模块typing模块collections模块pathlib模块shutil模块xml模块subprocess模块configparser模块Python常用模块小结time模块......
  • Java后端常用功能组件(持续更新)
    写项目时会存在大量的重复业务,不想重复的自己coding,就需要去cv。这里存放常用的功能代码,进行二次开发。说明这里只给出后端的代码,前端页面的请求用postman或其他应用。springboot应用结合目录与CTRL+f,可以快速定位到指定需求目录文件上传文件上传代码展示importl......