面试常考排序算法超详细总结

本文详细介绍了排序算法的基本概念,包括稳定排序与非稳定排序的定义,以及时间复杂度和空间复杂度。重点讲解了冒泡排序、插入排序、归并排序、选择排序、希尔排序、快速排序和堆排序的工作原理和典型应用场景,并提供了部分算法的代码实现。通过对这些算法的理解,读者可以更好地应对面试中的排序算法问题。
摘要由CSDN通过智能技术生成

算法基本知识铺垫

有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下:
1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储
空间进行比较和交换的数据排序。
4、非原地排序:需要利用额外的数组来辅助排序。
5、时间复杂度:一个算法执行所消耗的时间。
6、空间复杂度:运行完一个算法所需的内存大小

排序中的稳定排序

冒泡排序(bubble sort) — O(n2)
插入排序 (insertion sort)— O(n2)
归并排序 (merge sort)— O(n log n)

排序中的非稳定排序

面试考察中一般问快排,选择,希尔,堆这几种非稳定排序

选择排序 (selection sort)— O(n2)
希尔排序 (shell sort)— O(n log n)
堆排序 (heapsort)— O(n log n)
快速排序 (quicksort)— O(n log n)

冒泡排序:

冒泡排序法的各个计算步骤中, 数组也分成 “已排序部分” 和 “未排序部分”。

冒泡排序法
► 重复执行下述处理,直到数组中不包含顺序相反的相邻元素
1 . 从数组末尾开始依次比较相邻两个元素,如果大小关系相反则交换位置。

以 数 组 {5,3,2,4, 1 } 为例,我们对其使用冒泡排序法时,排序过程如图下图所示:
在这里插入图片描述

代码:
设置标识flag
,用以标识每一趟是否发生了交换,若不发生交换,则说明有序,无需再行比较。这一改进可以避免已经有序情况下无意义的判断。

// 冒泡排序
void bubbleSort(int arr[], int n) {
   
	bool flag = 1;
	for (int i = 0; flag; i++) {
   
		flag = 0;
		for (int j = n - 1; j >= i + 1; j--) {
   
			if (arr[j] < arr[j - 1]) {
   
				swap(arr[j], arr[j - 1]);
				flag = 1;
			}
		}
	}
}

插入排序 :

插入排序法在排序过程中,会将整个数组分成 “已排序部分” 和 “未排序部分”。
在这里插入图片描述

插入排序法
► 将开头元素视作已排序
► 执行下述处理,直至未排序部分消失
1.取出未排序部分的开头元素赋给变量v。
2.在已排序部分,将所有比 v 大的元素向后移动一个单位。
3.将已取出的元素 v 插入空位。

举个例子,我们对数组 {8,3,1,5,2,1 } 进行插入排序时,整体流程如图下图 所示:
在这里插入图片描述
代码:

//插入排序
void  insertionSort(int arr[], int n) {
   
	int j, v;
	for (int i = 0; i < n; i++) {
   
		v = arr[i];
		j = i - 1;
		while (j >= 0 && arr[j] > v) {
   
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值