排序算法——直接选择排序

简介: 排序算法——直接选择排序

一、直接选择排序

1.1.选择排序介绍
  • 直接选择排序又称简单选择排序
  • 整个过程就是每一趟都将无序区中的所有元素进行逐一比较,找到最小的元素,与无序区中的首个元素进行交换,有序区长度加1,无序区长度减1。
  • 重复以上步骤,直到所有的元素均已排好。
1.2.选择排序思路

请添加图片描述

请添加图片描述
💡💡思路:

  1. 将整个记录序列划分为有序区和无序区,初始时有序区为空,无序区含有待排序的所有记录
  2. 在第一趟无序区找到最小的一个数,排到有序区第一个,此时有序区加一个数字,无序区减少一个数字
  3. 重复上述操作,直到无序区只剩下一个数字为止。
1.3.时间复杂度
  • 第一次内循环比较n - 1次,然后是n-2次,n-3次,……,最后一次内循环比较1次。
  • 共比较的次数是 (n - 1) + (n - 2) + … + 1,求等差数列和,得 (n - 1 + 1)* n / 2 = n^2 / 2。
  • 舍去最高项系数,其时间复杂度为 O(n^2)。

选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都是O(n^2)

1.4.空间复杂度
简单选择排序仅需一个存储空间用于记录交换的暂存单元,即空间复杂度为 O(1)
1.5.代码实现

C++代码:

void selectSort(vector<int>& sortVector)            
//选择排序,每一趟选择最小的元素从前往后放置
{
    for (int i = 0; i < sortVector.size(); i++)
    {
        int target = i;
        for (int j = i; j < sortVector.size(); j++)
        {
            if (sortVector[target] > sortVector[j])
            {
                target = j;
            }
            int temp = sortVector[target];
            sortVector[target] = sortVector[i];
            sortVector[i] = temp;
        }
    }
}
 
#include"pch.h"
#include<iostream>
#include<list>
#define N 10
using namespace std;
 
 
void SelectSort(int arr[], int n)
{
    int min, i, j;
    //每次循环,选择出一个最小键值
    for (i = 1; i < n-1; i++)
    {
        //假设第i个记录键值最小
        min = i;
        for (j = i+1; j <= n; j++)  
            if (arr[j]< arr[min])
               //记录下键值较小记录的下标
                min = j;
            if (min != i)
                   // 将最小键值记录和第i个记录交换
                swap(arr[min], arr[i]);         
    }
}
int main()
{
    //初始化
    int nums[N+1] = {5,8,2,24,1,9,4,27,11,6};
    //简单选择排序
    SelectSort(nums,10);
    //打印排序结果
    for (int i = 1; i <= N; i++)
    {
        cout << nums[i] << endl;
    }
    
}
 
 

python代码:

def selection_sort(array):
    # 外循环 选择出一个最小键值
    for i in range(len(array)-1):
        # 假设第i个记录键值最小
        min_index = i
        # 内层循环
        for j in range(i+1, len(array)):
            if array[j] < array[min_index]:
                min_index = j
        if min_index != i:
            # 交换
            array[i], array[min_index] = array[min_index], array[i]
    return array
 
 
if __name__ == '__main__':
    array = [5,8,2,24,1,9,4,27,11,6]
    print(selection_sort(array))
1.6.优缺点

优点:

移动数据的次数已知(n-1次)

缺点:

比较次数多
相关文章
|
3月前
|
搜索推荐 算法 C语言
C语言选择排序算法,从入门到精通只需1秒!
C语言选择排序算法,从入门到精通只需1秒!
|
6天前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
2月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
2月前
|
搜索推荐
排序算法---选择排序-----详解&&代码
排序算法---选择排序-----详解&&代码
|
2月前
|
算法 搜索推荐
数据结构与算法-选择排序
数据结构与算法-选择排序
21 4
|
2月前
|
搜索推荐 算法
【C/排序算法】:堆排序和选择排序
【C/排序算法】:堆排序和选择排序
19 0
|
2月前
|
算法 搜索推荐 Java
JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)
JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)
25 0
|
2月前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
24 0
|
3月前
|
存储 算法 搜索推荐
【数据结构与算法】:选择排序与快速排序
欢迎来到排序的第二个部分:选择排序与快速排序!
【数据结构与算法】:选择排序与快速排序
|
3月前
|
算法 前端开发 搜索推荐
前端算法之选择排序
前端算法之选择排序
19 0

热门文章

最新文章