IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> (C语言)数据结构——排序算法总结与比较 -> 正文阅读

[数据结构与算法](C语言)数据结构——排序算法总结与比较

一、排序的概念及其运用

排序的概念

  • 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
    有些排序算法无论如何都不能保证它是稳定的,那么它就是不稳定的
    但有些排序算法我们加以控制就可以保证他是稳定的,那么它就是稳定的
  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

在这里插入图片描述

二、插入排序

详细博客链接:插入排序

直接插入排序:

  • 时间复杂度(最坏):O( n 2 n^2 n2)
    解释:第一次最坏移动一次元素,第二次最坏移动两次元素,以此类推,第n次最坏移动n次元素,所以计算公式为 ( 1 + n ) ? n / 2 (1+n)*n/2 (1+n)?n/2近似等于O( n 2 n^2 n2)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 初始数据集的排列顺序对算法的性能有无影响:有影响。
    解释:有序的情况下就不需要往前移动元素了,但是整趟排序最好的情况下外面的for循环也要进行n次。
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)//整趟排序的循环
	{
		int end = i;
		int tmp = a[end + 1];

		while (end >= 0)//让循环停止的条件有两个,一个是end<0,另一个是a[end] <= tmp
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];//往后挪元素
				end--;
			}
			else
			{
				break;//有序的情况下这里提前break退出循环
			}
		}
		a[end + 1] = tmp;//上面循环停止时在end+1的位置赋值为tmp即可
	}
}

希尔排序:

  • 时间复杂度(最坏):约为O( n 1.3 n^{1.3} n1.3)

  • 空间复杂度:O(1)

  • 稳定性:稳定

  • 初始数据集的排列顺序对算法的性能有无影响:有影响。
    解释:希尔是对插入排序的优化,这种优化是在无序的序列中才有明显的效果,如果序列接近有序,反而是插入最优。

三、选择排序

详细博客链接:选择排序

直接选择排序:

  • 时间复杂度(最坏):O( n 2 n^2 n2)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 初始数据集的排列顺序对算法的性能有无影响:没有影响。
    解释:无论有序还是无序,都要全部进行比较。

堆排序:

  • 时间复杂度(最坏):O( n ? l o g 2 n n*log^n_2 n?log2n?)
  • 解释:n是建堆的时间, l o g 2 n log^n_2 log2n?是在堆中查找的时间
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 初始数据集的排列顺序对算法的性能有无影响:没有影响。
    解释:雷打不动的就是一直排序到最后一个元素,无论有序还是无序。

四、交换排序

详细博客链接:(C语言)数据结构——冒泡排序和快速排序(超详解)

冒泡排序:

  • 时间复杂度(最坏):O( n 2 n^2 n2)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 初始数据集的排列顺序对算法的性能有无影响:有影响。
    解释:我们可以设置一个flag,若一趟排序中没有数据交换的情况下,根据flag的值就可以控制结束整个程序的进行。

快速排序:

  • 时间复杂度(优化过后):O( n ? l o g 2 n n*log^n_2 n?log2n?)
  • 空间复杂度:O( l o g 2 n log^n_2 log2n?)
    解释:递归一边(左边)建立了 l o g 2 n log^n_2 log2n?层栈帧,退回去再调用另一边(右边),用的是之前的空间。
  • 稳定性:不稳定
    解释:举个例子,假如全是相同的元素的时候,必然中间的那个值会被替换成为基准值key
  • 初始数据集的排列顺序对算法的性能有无影响:有影响。
    解释:详情可以参考(C语言)数据结构——冒泡排序和快速排序(超详解)中对快速排序算法的优化,会给你一些启发
    在这里插入图片描述

五、归并排序

博客链接:归并排序

  • 时间复杂度(最坏):O( n ? l o g 2 n n*log^n_2 n?log2n?)
  • 空间复杂度:O(n)
  • 稳定性:稳定
    解释:下面递归的代码,加上一个等于号,我们就能控制它是稳定的。
    看下面代码:
void _MergeSort(int* a, int begin, int end, int* tmp)
{
	if (begin == end)
		return;

	int mid = (end + begin) / 2;
	// [begin, mid] [mid+1, end]

	_MergeSort(a, begin, mid, tmp);
	_MergeSort(a, mid+1, end, tmp);

	// 取小的尾插
	// [begin, mid] [mid+1, end]
	int begin1 = begin, end1 = mid;
	int begin2 = mid+1, end2 = end;
	int i = begin;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])///把这里的等于号去掉就不是稳定的了
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2++];
		}
	}

	while (begin1 <= end1)
	{
		tmp[i++] = a[begin1++];
	}

	while (begin2 <= end2)
	{
		tmp[i++] = a[begin2++];
	}

	// 拷贝回原数组 -- 归并哪部分就拷贝哪部分回去
	memcpy(a+begin, tmp+begin, (end-begin+1)*sizeof(int));
}

void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int)*n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}

	_MergeSort(a, 0, n - 1, tmp);

	free(tmp);
	tmp = NULL;
}

  • 初始数据集的排列顺序对算法的性能有无影响:没有影响。

总结:
在这里插入图片描述

end
有哪里看不懂可以随时向博主提问
有错误的地方欢迎各位老铁批评指正。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:19:25  更:2022-09-24 21:19:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:49:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码