当前位置: 首页 > article >正文

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

目录

1.直接选择排序思想

2.直接选择排序实现

3.直接选择排序总结


1.直接选择排序思想

思想:每次从剩余的待排序序列中选出最小or最大的元素,放在正确的位置,当把最后一个元素也放在正确的位置的时候,排序完成。

步骤如下:

  • 在元素集合array[i] ~ array[n-1]中选择关键码最大(小)的数据元素。
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。
  • 在剩余的array[i] ~ array[n-2](array[i+1] ~ array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。

2.直接选择排序实现

#include <stdio.h>

void swap(int* p1, int *p2)
{
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

void SelectSort(int *nums, int n)
{
	int i = 0;
	for(i = 0; i < n; ++i) // 枚举起始元素 
	{
		int j = 0;
		int min_i = i;     // 记录最小元素的下标
		 
		// 从起始区间开始寻找最小元素的下标 
		for(j = i; j < n; ++j) 
		{
			min_i = nums[min_i] < nums[j] ? min_i : j;
		}
		swap(&nums[min_i], &nums[i]);
	}
}


int main()
{
	int nums[] = {5,4,8,9,6,3,2,1,7,0};
	
	SelectSort(nums,10);
	
	int i = 0;
	while(i < sizeof(nums) / sizeof(int))
	{
		printf("%d ",nums[i]);
		i++;
	}
	
	return 0;
}

需要注意的是: 

  • 我们每次寻找的并不是最小的元素,而是最小元素的下标。

代码优化:上面的代码中,在选择元素的时候,我们每次遍历剩余数据,都只能选出一个最小的数据,然后放在正确的位置上;其实我们不仅仅可以在遍历的时候,选出最小的元素,还能够选出最大的元素,把小的元素从左往右放入正确位置,把大的元素从右到左放入正确位置。

优化后的代码如下:

void swap(int* p1, int *p2)
{
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

// 时间复杂度:O(N^2)
void SelectSort(int* nums, int n)
{
	int left = 0, right = n - 1;

	while (left < right)
	{
		// [left, right]
		int min_i = left, max_i = left;
		for (int i = left; i <= right; i++)
		{
			if (nums[i] > nums[max_i])
			{
				max_i = i;
			}

			if (nums[i] < nums[min_i])
			{
				min_i = i;
			}
		}

		swap(&nums[left], &nums[min_i]);
		// max如果被换走了,修正一下
		if (max_i == left)
		{
			max_i = min_i;
		}

		swap(&nums[right], &nums[max_i]);

		++left;
		--right;
	}
}

3.直接选择排序总结

  • 直接选择排序思考非常好理解,但是效率不是很好,实际中很少使用。
  • 时间复杂度为:O(N^2);
  • 空间复杂度为:O(1);
  • 稳定性:不稳定,如下图所示。


http://www.kler.cn/news/366127.html

相关文章:

  • HBuilder X 中Vue.js基础使用->计算属性的应用(三)
  • BFS解决FloodFill算法(4)_被围绕的区域
  • YOLO系列入门:1、YOLO V11环境搭建
  • 基于Netty构建WebSocket服务并实现项目群组聊天和实时消息通知推送
  • AI带货主播框架的搭建!
  • 养狗为什么需要宠物空气净化器?宠物空气净化器排行榜公布!
  • 在 Vue 渲染模板时,如何保留模板中的 HTML 注释?
  • 界面控件DevExpress WPF中文教程:Data Grid——表格视图概述
  • 家政服务管理系统小程序ssm+论文源码调试讲解
  • hiveserver与beeline
  • 【Linux 从基础到进阶】实时性能监控与调优(Prometheus、Grafana)
  • PL/I语言的起源?有C语言,有B语言和A语言吗?为什么shell脚本最开始可能有#!/bin/bash字样?为什么不支持嵌套注释?
  • 机器学习与深度学习的分类
  • 大数据治理平台建设规划方案(71页WORD)
  • opencv - py_photo - py_non_local_means 非局部均值去噪
  • LinkedList和链表之刷题课(上)
  • STM32--TIM编码器接口
  • 从区别看本质:CRM和SCRM的全面对比
  • 江协科技STM32学习- P21 ADC模数转换器
  • 前端拥抱AI:LangChain.js 入门遇山开路之PromptTemplate
  • Python游戏开发超详细(基础理论知识篇)
  • 实现信创Linux麦克风摄像头RTMP推流(源码,银河麒麟、统信UOS)
  • 如何为工业未来赋能?通过CodeMeter为工业企业开辟工业自动化安全与灵活性之道
  • 羽毛球场馆预约小程序,提高场馆便捷性、利用率
  • 进程的控制(创建、终止、等待,程序替换)
  • 从0到1,搭建vue3项目