首页 > 编程语言 >每天学习一个基础算法之选择排序

每天学习一个基础算法之选择排序

时间:2024-08-23 15:24:56浏览次数:8  
标签:minIndex arr 每天 int 复杂度 选择 算法 排序

目录

前言:

一、选择排序的基本思路和实现方法

1、基本思路

2、实现方法

二、选择排序的执行过程示意图

三、选择排序的实现代码

选择排序代码主体(以接口函数的形式)

测试部分(主函数调用)

 四、对选择排序复杂度的分析

背景知识:

1、选择排序的时间复杂度

 精确计算:

*采用大O的渐进表示法:

 2、选择排序的空间复杂度

采用大O的渐进表示法:


本文从概念理解、思路分析、画图举例,代码实现、复杂度分析等多个方面对选择排序进行详细的讲解,包含选择排序的基本思路与实现方法、执行过程示意图、代码,以及对时间和空间复杂度的分析多个方面的知识。目录清晰,重点标红,部分加粗,方便各位初学者和复习者注意、搜索。

一、选择排序的基本思路和实现方法

1、基本思路

选择排序的基本思路:每次从待排序的数据中选出最小元素,顺序放在之前已经排好序的数据最后,直到全部数据排序完毕。

2、实现方法

实现方式:取第一个数和后面的数逐一比较,然后一轮之后得到最小的数放在第一个,然后开始取第二个,重复之前的比较,直到完成排序为止。

二、选择排序的执行过程示意图

(手工画图不够精美,还请见谅)

橙色部分为已排序区域,白色部分为未排序区域,箭头表示每轮选出的最小值要放置的位置。 

三、选择排序的实现代码

选择排序代码主体(以接口函数的形式)

//选择排序的实现
static void select_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz-1; i++)
    {
        int minIndex = i;//记录最小索引
        int j = 0;
        for (j = i + 1; j < sz; j++)
        {
            if (arr[minIndex] > arr[j])
            {
                minIndex = j;
            }
        }
        int tmp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = tmp;
    }
}

测试部分(主函数调用)

#include <stdio.h>
int main()
{
    int arr[] = { 10,7,4,9,6,1,8,3,2,5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    select_sort(arr, sz);
    int i = 0;
    //对排序完成的数组进行输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
 
}

 四、对选择排序复杂度的分析

背景知识

时间复杂度:表示算法中基本操作(一般表示重复执行的操作)的执行次数,并不需要计算精确的执行次数,而只需要计算大概执行次数。 但我们计算时一般会尽可能先算其精确值,再通过大O的渐进表示法,取对变化趋势影响最大的部分。

空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,算的是额外创建变量的个数,也使用大O的渐进表示法。

1、选择排序的时间复杂度

 精确计算:

选择排序采用双层嵌套循环,外层循环次数为N-1(N表示要比较的数组的元素个数),内层循环次数N-1-i(i表示当前外层循环的情况)

计算起来便是:

(n-1)+(n-2)+(n-3)+……+3+2+1(为一个等差数列)

=1/2*n^2-1/2*n

*采用大O的渐进表示法:

表示为O(N^2) 

 2、选择排序的空间复杂度

采用选择排序算法进行数据排序时,只使用了minIndex这一额外变量来记录最小值,且该变量可以重复使用,不是排序数据大小而影响,始终为常数1.(不同计算标准对“额外”定义不同,但我们一般最终都会使用大O渐进法表示,差异不大,不必硬纠)

采用大O的渐进表示法:

表示为O(1)

 

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

标签:minIndex,arr,每天,int,复杂度,选择,算法,排序
From: https://blog.csdn.net/gybhh/article/details/141422217

相关文章

  • 24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,33
    目录198.打家劫舍题目描述题解213.打家劫舍II题目描述题解337.打家劫舍III题目描述题解打家劫舍的一天......
  • 交换排序(冒泡排序和快速排序)
    一、基本思想所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。二、冒泡排序1.核心思想两两相邻的元素进行比较2.动图展示3.代码展示voidSwap(int*......
  • 用Python实现9大回归算法详解——09. 决策树回归算法
    1.决策树回归的基本概念决策树回归(DecisionTreeRegression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈值来最大化每次分裂后的目标函数增益,从而找到使误差最小化的模型......
  • 【LLM & RAG & text2sql】大模型在知识图谱问答上的核心算法详细思路及实践
    前言本文介绍了一个融合RAG(Retrieval-AugmentedGeneration)思路的KBQA(Knowledge-BasedQuestionAnswering)系统的核心算法及实现步骤。KBQA系统的目标是通过自然语言处理技术,从知识图谱中提取和生成精确的答案。系统的实现包括多个关键步骤:mention识别、实体链接及排序、属......
  • 字符串搜索算法
    目录二分搜索(适用于有序字符串数组)Trie树(前缀树)后缀树与后缀数组二分搜索(适用于有序字符串数组)基本概念二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中查找特定元素。与线性搜索相比,二分搜索通过逐步减少搜索范围,大幅提高查找效率。算法步骤确定中间元......
  • CNN-BiLSTM-Attention(12种算法优化CNN-BiLSTM-Attention多输入单输出)
     12种算法优化CNN-BiLSTM-Attention模型预测的代码。其中Attention模型可以改为单头或者多头,在代码中就是改个数字而已。代码注释已写好如何更改。12种算法优化CNN-BiLSTM-Attention多特征输入单步预测代码获取戳此处代码获取戳此处代码获取戳此处主要功能为:采用12种......
  • 【408DS算法题】022基础-递增输出单链表中的结点值
    Index题目分析实现总结以上内容稍后补全,以下内容来自https://blog.csdn.net/weixin_60702024/article/details/141336041题目分析实现总结分析题目给定单链表的头结点,按照递增的顺序,输出单链表结点的值。分析实现具体实现如下:总结注意delete执行后,只会将......
  • Scratch编程深度探索:解锁递归与分治算法的奥秘
    标题:Scratch编程深度探索:解锁递归与分治算法的奥秘在编程的世界里,递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch,这款专为儿童和初学者设计的图形化编程工具,是否能够支持实现这样复杂的逻辑呢?本文将深入探讨Scratch在实现递归和分治算法方面的能力,并提......
  • 代码随想录DAY22 - 回溯算法 - 08/21
    目录理论回顾什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯组合题干思路和代码递归法递归优化:剪枝组合总和Ⅲ题干思路和代码递归法递归优化电话号码的字母组合题干思路和代码递归法理论回顾什么是回溯法回溯是一种类似枚举的搜索方法,回溯和......
  • 代码随想录DAY23 - 回溯算法 - 08/22
    组合总和题干题目:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少......