常见排序算法之选择排序

目录

一、选择排序

[1.1 什么是选择排序?](#1.1 什么是选择排序?)

[1.2 思路](#1.2 思路)

[1.2.1 思路一](#1.2.1 思路一)

[1.2.2 优化思路](#1.2.2 优化思路)

[1.3 C语言源码](#1.3 C语言源码)

[1.3.1 思路一](#1.3.1 思路一)

[1.3.2 优化思路](#1.3.2 优化思路)

二、堆排序


一、选择排序

1.1 什么是选择排序?

选择排序是一种简单直观的排序算法。它的基本思想是从未排序的数据中选择最小(或最大)的元素,放到已排序数据的末尾,同时将该元素从未排序部分删除,直到所有元素都排序完成。

具体操作为,首先找到未排序部分的最小元素,并与未排序部分的第一个元素交换位置,这样就完成了一次选择。然后,将接下来未排序部分的第一个元素视为最小,找到最小元素并与未排序部分的第一个元素交换位置,以此类推,直到所有元素都排序完成。

选择排序的时间复杂度为O(n^2),是一种不稳定的排序算法。虽然它的效率相对较低,但由于其简单易实现,可以用于排序小规模的数据集合。然而对于大规模数据集合,选择排序通常不是一个最佳的选择。

1.2 思路

1.2.1 思路一

  1. 遍历第一趟数组,找出数组的最小值,与第一个数据交换
  2. 遍历第二趟数组,继续找出最小值,与第二个数据交换
  3. 重复上述动作

1.2.2 优化思路

  1. 一趟遍历找到最大和最小的元素,分别把他们放到数组的两端
  2. 缩小区间最大最小值包含的区间,找到次大,次小的元素
  3. 以此类推,直到头尾下标重合

该思路可能存在的问题 :当maxi的位置与begin重合,则begin先与mini的位置交换,此时max位置的最大值被交换走,导致endmax交换的数值是错误的(图解见下)

1.3 C语言源码

1.3.1 思路一

cpp 复制代码
//交换两个数据
void Swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
//选择排序
void SelectSort(int* arr, int n)
{
	int i = 0;
    for (i = 0; i < n-1; i++)
    {
        int min = i;
        for (int j = i+1; j < n; j++)
        {
            if (arr[j] < arr[min])
            {
                min = j;
            }
        }
        Swap(&arr[i], &arr[min]);
    }
}

1.3.2 优化思路

cpp 复制代码
//交换两个元素
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
//插入排序
void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mini = begin;
		int maxi = begin;
		//在区间中找出最小的数和最大的数
		for (int i = begin + 1; i <= end; i++)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}
		//最小的数与首交换
		Swap(&a[begin], &a[mini]);
		
		//特殊情况修正
		if (begin == maxi)				
		{
			maxi = mini;
		}

		//最大的数与尾交换
		Swap(&a[end], &a[maxi]);
		begin++;
		end--;
	}
}

二、堆排序

请点击:堆排序详细理解-CSDN博客

相关推荐
jiao_mrswang10 分钟前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca19 分钟前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱19 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子24 分钟前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!25 分钟前
【优选算法】二分查找
c++·算法
王燕龙(大卫)29 分钟前
leetcode 数组中第k个最大元素
算法·leetcode
不去幼儿园1 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh1 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
盼海2 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou6 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot