数据结构与算法--十大排序之一选择排序

目录

选择排序的介绍

算法原理

代码实现


选择排序的介绍

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法

算法原理

n 个记录的直接选择排序可经过 n-1 趟直接选择排序得到有序结果。
  • 初始状态:无序区为R[1..n],有序区为空;
  • i趟排序 (i=1,2,3…n-1) 开始时,当 1个记录R交换,使 R[1..i] R[i+1..n) 分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了。

 代码实现

C++代码实现:

#include<iostream>


const int N = 110;
int arr[N];

void selection_sort(int arr[],int l,int r){
    int len =r - l + 1;
    int min_idx;
    for (int i = 0; i < len - 1; i++)
    {
        min_idx = i;  //先让最小的idx等于i
        /* code */
        for (int j = i + 1; j < len; j++) // 如果找到比i更小的数,更新min_idx
        {
            if (arr[j] < arr[min_idx]) min_idx = j;
            /* code */
        }
        std::swap(arr[i],arr[min_idx]);//交换位置
    }
    
} 
int main()
{
    //首行输入一个数字n(代表要排序的个数)
    //次行输入n个数(代表要排序的数字)
    int n;
    system("chcp 65001");

    std::cout << "输入排序的数字个数:"<< std::endl;
    std::cin >> n;
    std::cout << "输入排序的数字"<<std::endl;
    for (int i = 0; i < n; i++) std::cin >> arr[i];

    selection_sort(arr,0,n-1);

    for (int i = 0; i < n; i++) std::cout << arr[i] << " ";   
}

运行结果:

Active code page: 65001
输入排序的数字个数:
5
输入排序的数字
3 2 12 34 32
2 3 12 32 34 

Python代码实现:
 

def selection_sort(num:list[int]) ->None:
    #设置要几轮循环才可以排序完成
    for i in range(0,len(num) - 1):
        #默认认为最小的是没排序的第一个数据
        min_index = i
        #找到最小数据的索引位置
        for j in range(i + 1,len(num)):
            if num[j] < num[min_index]:
                min_index = j

        #交换索引位置上的数据
        num[i],num[min_index] = num[min_index],num[i]

if __name__ == '__main__':
    num = list(map(int,input().split()))
    selection_sort(num)
    print(num)

运行结果:
 

3 4 2 13 34 
[2, 3, 4, 13, 34]
时间复杂度: O(n^2)
空间复杂度: O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值