选择排序!!!基础排序详解 C语言版

目录

1.什么是选择排序

2.选择排序源代码

3.优化代码


1.什么是选择排序

这是一个选择排序的流程图,其实很简单,就是每次挑选数字中最小的作为第一个 ,直到整个数据有序就结束了

顾名思义,选择,那就是选取,选取其中最小的,放在最前面的位置,已经选好的位子,下一次就不加入选择了。

每一次安排一个位置,直到所有位置都安排了。

2.选择排序源代码

void Swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
// initial verse
void My_SelctSort(int* arr,int sz)
{
	int mini = 0;
	for (int i = 0; i < sz; i++)
	{
		int mini = i;
		for (int j = i; j < sz; j++)
		{
			if (arr[mini] > arr[j])
			{
				mini = j;
			}
		}
		Swap(&arr[mini], &arr[i]);
	}
}

swap函数就是自写的交换数据的函数。变量必须是指针!!!

 关于转换我和大家说一遍流程,看向上面的流程图。刚开始我们的数组是25314.

第一次循环 我们的 mini 就是 i = 0,就说明我们现在最小的元素要放在 数组中 0 这个位置。

第一个for循环用来遍历数组中的每一个位置都要排序。

进入第二个for 循环,用来循环原来从 i 这个位置开始的数组,找到其中最小的一个元素,把这时候的 最小元素的位置记录下来保存在mini中。

最后在交换mini 位置 和 i 位置(还没被安排过的位置)的元素即可

3.优化代码

void My_SelctSortoptimize(int* arr, int sz)
{
	int begin = 0;
	int end = sz - 1;
	while (begin < end)
	{
		int maxi = begin;
		int mini = begin;
		for (int i = begin; i <= end; i++)
		{
			if (arr[i] > arr[maxi])
			{
				maxi = i;
			}
			if (arr[i] < arr[mini])
			{
				mini = i;
			}
		}
		Swap(&arr[mini], &arr[begin]);
		if (maxi == begin)
		{
			maxi = mini;
		}
		Swap(&arr[maxi], &arr[end]);
		end--;
		begin++;
	}
}

优化代码和普通版本的代码的区别就是,优化代码一次要判定两个元素,最大和最小的元素。并且还有一个易错点。

总体思路和上述一样,为什么第一个循环不用for循环了呢?

因为一次找两个元素,相当于减少了外层循环的一半,有点类似二分查找,begin和end相遇时停止循环。用for循环没有while循环清晰明了。

刚刚说还有一个易错点,那就是当你的 maxi 位置和 begin位置重合的时候,这时候如果把最小的交换过去,那maxi 这个位置的元素就变成最小的了。(如下图),这时候就要判断是否max 和 b 重合,如果重合,再 mini 和 b 位置的元素交换了以后,要把 maxi 变成 mini ,因为交换了以后 mini 下存的才是最大的元素。

相关推荐

  1. 冒泡排序选择排序--C语言

    2024-01-06 09:58:03       17 阅读
  2. 王道c语言-选择排序

    2024-01-06 09:58:03       13 阅读
  3. C#基础选择排序

    2024-01-06 09:58:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 09:58:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 09:58:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 09:58:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 09:58:03       18 阅读

热门阅读

  1. 牧马人K87调节键盘灯光模式

    2024-01-06 09:58:03       38 阅读
  2. Es 学习记录

    2024-01-06 09:58:03       33 阅读
  3. Shell:常用命令之dirname与basename

    2024-01-06 09:58:03       30 阅读
  4. 动手学深度学习—深度学习计算

    2024-01-06 09:58:03       28 阅读
  5. Apache绑定指定地址与端口

    2024-01-06 09:58:03       35 阅读
  6. ARM CCA机密计算架构软件栈简介

    2024-01-06 09:58:03       36 阅读
  7. leetcode231 判断一个给定的整数是否是2的n次幂

    2024-01-06 09:58:03       33 阅读
  8. Winform、WPF如何解决前端卡死问题

    2024-01-06 09:58:03       32 阅读
  9. Hbase进阶

    2024-01-06 09:58:03       31 阅读