数据结构13:排序

文章目录

简介

排序在编程中有着很多的应用,例如中值滤波、求最大值或最小值等。在本节中,我们将对冒泡排序、选择排序和插入排序这三种排序方式进行讲解。

冒泡排序

冒泡排序的主要思想就是两两比较,然后根据数据比较的结果决定是否进行位置交换 ,逐次将每次比较数据中最大或者最小的数据放到对应的位置,最终按照要求的排序起来,其过程如图1所示。

图1中,原始数据的顺序为1、3、8、4、2,现在按照由小到大的顺序对他们进行排列:

第一次排序,5个数据参与比较,比较4次,将8放到了最后位置;

第二次排序,4个数据参与比较,比较3次,4被放到了8前面的位置;

第三次排序,3个数据参与比较,比较2次,3被放到了4前面的位置;

第四次排序,2个数据参与比较,未发生数据位置变动;

至此,数据排序完成。

代码实现:

c 复制代码
int PopSort(int *data, int len)
{
	//输入检测
	if (data == NULL || len <2)
	{
		return -1;
	}
	//定义循环变量
	int i, j;
	int temp;
	for (i = 1; i < len; i++)
	{
		for (j = 0; j < len - i; j++)
		{
			//判断相邻数据关系,根据关系进行位置交换
			if (data[j]>data[j + 1])
			{
				temp    = data[j];
				data[j] = data[j + 1];
				data[j + 1] = temp;
			}
		}
	}
}

选择排序

选择排序的思想是将每次排序先假定一个最大或最小的数据,然后在比较时,与比它大或者比它小的数据,交换位置,逐次完成数据的排序,其过程如图2所示。

在图2中,原始数据顺序为:1、3、8、4、2,现在按照由小到大的顺序对他们进行排列:

第一次排序,将1假定为最小数据,比较4次,没有位置交换;

第二次排序,将3假定为最小数据,比较3次,与2交换位置;

第三次排序,将8假定为最小数据,比较2次,与3交换位置;

第四次排序,将4假定为最小数据,比较1次,没有位置交换;

至此,数据排序完成。

代码实现:

c 复制代码
int SelectSort(int *data, int len)
{
	//输入检测
	if (data == NULL || len <2)
	{
		return -1;
	}
	//定义循环变量
	int i, j;
	int temp;
	int min;

	for (i = 0; i < len; i++)
	{
		min = i;
		for (j = i + 1; j < len ; j++)
		{
			if (data[min] > data[j])
			{
				min = j;
			}
		}
		if (min != i)
		{
			temp = data[min];
			data[min] = data[i];
			data[i] = temp;
		}
	}

	return 0;
}

插入排序

插入排序的思想是比较、移位和插入,通过比较和移位将数据插入到有序数组中。下面根据其过程对其进行详细的讲解,其过程如图3所示。

在图2中,原始数据顺序为:1、3、8、4、2,现在按照由小到大的顺序对他们进行排列:

第一次排序,认为数据1位于有序数列,将3插入到有序数列,3大于1,无需移动和插入;

第二次排序,数据1、3位于有序数列,将8插入到有序数列,8大于3,无需移动和插入;

第三次排序,数据1、3、8位于有序数列,将4插入到有序数列,4小于8但大于3,将8后移一位,将4插入到原来8的位置;

第四次排序,数据1、3、4、8位于有序数列,将2插入到有序数列,2小于3、4、8但大于1,将3、4、8后一位,将2插入到原来3的位置;

至此,数据排序完成。

代码实现:

c 复制代码
int InertSort(int *data, int len)
{
	//输入检测
	if (data == NULL || len <2)
	{
		return -1;
	}
	//定义循环变量
	int i, j;
	int temp;
	for (i = 1; i<len; i++)
	{
		temp = data[i];//从待插入组取出第一个元素。 
		j = i - 1; //i-1即为有序组最后一个元素的下标 
		//元素判断和后移
		while (j >= 0 && temp<data[j])  //j>=0对其进行边界限制;第二个为插入判断条件 
		{
			data[j + 1] = data[j];//有序组元素向后移动 
			j--;
		}
		data[j + 1] = temp;//将元素插入
	}
	return 0;
}
相关推荐
_日拱一卒10 分钟前
LeetCode:矩阵置零
java·数据结构·线性代数·算法·leetcode·职场和发展·矩阵
橘子编程36 分钟前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式
意疏1 小时前
【C语言】解决VScode中文乱码问题
c语言·开发语言·vscode
汀、人工智能1 小时前
[特殊字符] 第94课:删除无效的括号
数据结构·算法·数据库架构·图论·bfs·删除无效的括号
Shadow(⊙o⊙)1 小时前
C语言学习中需要的额外函数
c语言·开发语言·学习
Imxyk1 小时前
P9244 [蓝桥杯 2023 省 B] 子串简写
数据结构·c++·算法
艾莉丝努力练剑1 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
汀、人工智能1 小时前
[特殊字符] 第106课:旋转图像
数据结构·算法·矩阵·数据库架构·数组·旋转图像
牧瀬クリスだ1 小时前
七大排序一次满足
数据结构·算法·排序算法
liu****1 小时前
第15届省赛蓝桥杯大赛C/C++大学B组
开发语言·数据结构·c++·算法·蓝桥杯·acm