目录
前言:
一、选择排序的基本思路和实现方法
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)。
每日一学,今天你又超过了百分之九十九的人。
如果本篇文章对你有帮助,请点个关注和赞吧!