首页 > 编程语言 >【数据结构】排序算法篇一

【数据结构】排序算法篇一

时间:2024-08-31 08:53:11浏览次数:6  
标签:排序 end int gap 算法 aSize array 数据结构

【数据结构】排序算法篇一

1. 插入排序

(1)基本思想:

由下图可以得出:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

(4)代码实现:

void InsertSort(int *a,int aSize)
{
	for (int i = 1; i < aSize; i++)
	{
		int end = i - 1;
		int tmp = a[i];//tmp需要保存的是数组i处的值(a[i]),如果存下标,会被a[end + 1] = a[end];该句代码覆盖
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
			a[end + 1] = tmp;
		}
	}
}

(5)特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

2. 希尔排序( 缩小增量排序 )

(1)基本思想:

先选定一个整数(gap),把待排序文件中所有记录分成个若干组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后gap缩小,重复上述分组和排序的工作。当gap到达=1时,所有记录在统一组内排好序。

(2)静态图解:

在这里插入图片描述

(3)具体步骤:

该排序部分类似于插入排序

(4)代码实现:

void ShellSort(int* a, int aSize)
{
	int gap = aSize;
	while (gap > 1)
	{
		//gap > 1 预排序//gap = 1 插入排序
		gap /= 2;//或gab/=3+1;保证gab最后可等于1,此时即为最后一遍插入排序
		for (int i = 0; i < aSize - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
				a[end + gap] = tmp;
			}
		}

	}
}

(5)特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快,可以达到优化的效果。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,因此希尔排序的时间复杂度未固定

在这里插入图片描述

3. 堆排序

(1)基本思想:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆

(2)具体步骤:

先实现一个向下调整建大堆函数,利用其将欲排序数组建为大堆,然后按照下面思想实现升序
在这里插入图片描述

(3)代码实现:

void Swap(int* p, int* q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}
void AdjustDown(int* a, int aSize, int parent)//向下调整建大堆
{
	int child = 2 * parent + 1;
	while (child < aSize)
	{
		//不要漏掉条件child + 1 < aSize
		if (child + 1 < aSize && a[child] < a[child + 1])
		{
			child++;
		}
		//此时a[child]为大孩子
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}
void HeapSort(int* a, int aSize)
{
	for (int i = (aSize - 1 - 1) / 2; i >= 0; i--)//将数组a建为大堆
	{
		AdjustDown(a, aSize, i);
	}
	//实现升序
	int end = aSize - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}
}

(4)特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

4. 选择排序

(1)基本思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

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

(4)代码实现:

void Swap(int* p, int* q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}
void SelectSort(int* a, int aSize)
{
	for (int j = 0; j < aSize; j++)
	{
		int min = j;
		for (int i = j; i < aSize; i++)
		{
			if (a[i] < a[min])
			{
				min = i;
			}
		}
		Swap(&a[min], &a[j]);
	}
}

(5)特性总结:

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

标签:排序,end,int,gap,算法,aSize,array,数据结构
From: https://blog.csdn.net/2303_80737493/article/details/141668145

相关文章

  • 代码随想录算法day4 - 链表2
    题目124.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]......
  • 【秋招笔试】8.30饿了么秋招(算法岗)-三语言题解
    ......
  • 深度强化学习算法(六)(附带MATLAB程序)
    深度强化学习(DeepReinforcementLearning,DRL)结合了深度学习和强化学习的优点,能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数,从而提高学习能力和决策效率。一、关键算法分类1.1深度Q网络(DeepQ-Networ......
  • 卡尔曼滤波算法(c语言代码)
    卡尔曼滤波器是一种用于估计动态系统状态的算法,常用于信号处理、控制系统、机器人和导航等领域。以下是一个简单的卡尔曼滤波器的C语言实现示例。这个示例展示了如何使用卡尔曼滤波器来估计一维系统的状态。1.卡尔曼滤波器算法概述卡尔曼滤波器由两部分组成:预测和更新。基......
  • 【智能算法改进】多策略融合的改进黑猩猩搜索算法及其应用
    目录1.算法原理2.改进点3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】黑猩猩优化算法(ChOA)原理及实现2.改进点改进的Sine混沌映射初始化种群ChoA种群随机初始化的方法导致种群多样性、均匀性差、容易出现边界聚集现象,而混沌映射可以有效的改善上述......
  • Linux 数据结构 树知识
                                                                                    树:只有一个前驱,但......
  • 模板方法模式:如何实现同一模板框架下的算法扩展?
    模板方法模式的原理和代码实现都比较简单,在软件开发中也被广泛应用,但是因为使用继承机制,副作用往往盖过了主要作用,所以在使用时尤其要小心谨慎。一、模式原理分析模板方法模式原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重......
  • 【智能算法应用】基于融合改进A星-麻雀搜索算法求解六边形栅格地图路径规划
    目录1.算法原理2.结果展示3.参考文献4.代码获取1.算法原理【智能算法】麻雀搜索算法(SSA)原理及实现六边形栅格地图分析一下地图:六边形栅格地图上移动可以看做6领域运动,偶数列与奇数列移动方式有所差异,将六边形栅格地图与二维栅格地图做映射可以发现:偶数列移动......
  • 机器学习:DBSCAN算法(内有精彩动图)
    目录前言一、DBSCAN算法1.动图展示(图片转载自网络)2.步骤详解3.参数配置二、代码实现1.完整代码2.代码详解1.导入数据2.通过循环确定参数最佳值总结前言        DBSCAN(Density-BasedSpatialClusteringofApplicationswithNoise)是一种基于密度的聚类......
  • 用c++以数组的形式实现栈的数据结构
    #include<iostream>usingnamespacestd;//设置数组的最大值#define MaxSize100intA[MaxSize];//栈顶inttop=-1;//入栈voidpush(intx){  //处理溢出的情况  if(top==MaxSize-1){    cout<<"stackoverflow"<<endl;    return; ......