浅析常用排序算法

1.排序算法的评价

涉及到时间复杂度(最差、平均、最好)
空间复杂度(需要额外的内存空间)
稳定性(两个相等键值R和S,原串R在S前,排序后R还在S前,称为稳定)

2.涉及到的排序算法

插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序、基数排序、希尔排序。

3.插入排序

源数据集:        64   5   7   89   5   24   32   18   40
初始化 :         {64}   5   7   89   5   24   32   18   40
第一次排序:   {5   64}  7   89   5   24   32   18   40        
第二次排序      {5    7  64}   89   5   24   32   18   40
第三次排序      {5    7  64   89}   5   24   32   18   40
第四次排序      {5    5    7  64   89}  24   32   18   40
第五次排序      {5    5    7  24   64   89}  32   18   40
第六次排序      {5    5    7  24   32   64   89}  18   40
第七次排序      {5    5    7  18   24   32   64   89}  40
第八次排序      {5    5    7  18   24   32   64   89  40}

函数代码
template<class T>
void InsertSort(T arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		int j = i;
		T temp = arr[i+1];
		while (temp < arr[j] && j >= 0)
		{
			arr[j+1] = arr[j];
			j--;
		}
		arr[j+1] = temp;
	}
}
时间复杂度: 最好情况 O(n)  最坏情况O(n*n) 平均情况O(n*n)
稳定性        : 稳定
空间复杂度:O(1)

4. 冒泡排序

源数据集:        64    5   7   89   5    24   32   18   40
第一次排序:      5   7   64   5   24   32   18   40   89       
第二次排序         5    7   5    24  32   18    40   64  89
第三次排序         5    5   7   24   18   32    40  64  89 
第四次排序         5    5   7   18    24   32   40   64  89 
第五次排序         5    5    7  18    24   32   40   64  89

函数代码
template<class T>
void BubbleSort(T arr[], int len)
{
	bool cmpFlag = true;
	for (int i = 0; i < len - 1 && cmpFlag; i++)
	{
		cmpFlag = false;
		for (int j = 0; j < len - i - 1; j++)
		{
			if (arr[j] > arr[j+1])
			{
				Swap(arr[j], arr[j+1]);
				cmpFlag = true;
			}
		}
	}
}

时间复杂度: 最好情况O(n) 最坏情况O(n*n) 平均情况O(n*n)
稳定性:  稳定
空间复杂度:O(1)

5.选择排序

源数据集:         5    7   89   5    24   32   2   40
第一次排序:    2    7   89   5  24   32     5  40          //不稳定的例子
第二次排序        2    5   89   7   24   32   5   40
第三次排序        2    5   5     7   24    32   89  40
第四次排序       2     5   5    7   24    32   89  40
第五次排序       2     5   5    7   24    32   89   40
第六次排序       2     5   5    7   24    32   89   40
第七次排序       2     5   5    7   24    32   40   89

函数代码
template<class T>
void SelectSort(T arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		T min = arr[i];
		int index = i;
		for (int j = i; j < len; j++)
		{
			if (min > arr[j])
			{
				min = arr[j];
				index = j;
			}
		}

		if (index != i)
			Swap(arr[i], arr[index]);
	}
}

时间复杂度:最好情况 O(n*n) 最坏情况O(n*n) 平均情况O(n*n)
稳定性: 不稳定
空间复杂度:O(1)

6.快速排序

源数据集:        64    5   7   89   5    24   32   18   40
第一次快排:    40   5   7   89    5   24   32    18  64
                            40   5   7   64    5   24   32    18  89
                            40   5   7   18    5   24   32    64  89
.....................

函数代码
template<class T>
void QuickSort(T arr[], int len)
{
	QuickSort(arr, 0, len-1);
}

template<class T>
void QuickSort(T arr[], int low, int high)
{
	if (low >= high)
		return;

	T key = arr[(low+high)/2];
	int i = low, j = high;

	while (i < j)
	{
		while (i < j && arr[j] > key)
			j--;
		while (i < j && arr[i] < key)
			i++;

		if (i < j)
		{
			Swap(arr[i], arr[j]);
			i++;
			j--;
		}

		if (i >= j)
			break;
	}

	QuickSort(arr, low, j);
	QuickSort(arr, j+1, high);
}

时间复杂度:最好情况O(nlog2n) 最坏情况O(n*n) 平均情况O(nlog2n)
稳定性:不稳定
空间复杂度: 平均O(log2n)

7.堆排序

函数代码
template<class T>
void CreateHeap(T arr[], int n, int h)
{
	int i = h;
	int j = 2 * i + 1;
	T temp = arr[i];
	bool flag = true;

	while (j < n && flag)
	{
		if (j < n - 1 && arr[j] < arr[j+1])
			j++;

		if (temp > arr[j])
		{
			flag = false;
		}
		else
		{
			arr[i] = arr[j];
			i = j;
			j = 2 * i + 1;
		}
	}

	arr[i] = temp;
}

template<class T>
void InitCreateHeap(T arr[], int len)
{
	for (int i = (len - 1) / 2; i >=0; i--)
		CreateHeap(arr, len,i);
}

template<class T>
void HeapSort(T arr[], int len)
{
	InitCreateHeap(arr, len);

	for (int i = len - 1; i > 0; i--)
	{
		T temp = arr[0];
		arr[0] = arr[i];
		arr[i] = temp;

		CreateHeap(arr, i, 0);
	}
}

时间复杂度: 最好情况 O(nlog2n)  最坏情况O(nlog2n) 平均O(nlog2n)
稳定性:          不稳定
空间复杂度:   O(1)

8. 归并排序

源数据集:        64    5    7   89   5    24   32   18   40
第一次归并:     5  64    7   89   5    24   18   32   40
第二次归并:     5   7    64  89    5   18   24    32   40
第三次归并:    5     5    7   18   24   32  64     89   40
第四次归并:    5     5    7   18  24    32   40     64   89

函数代码:略

时间复杂度:O(nlog2n)
稳定性: 稳定
空间复杂度: O(n)

9. 基数排序

时间复杂度 O(d(n+radix))
稳定性 : 稳定
空间复杂度 O(radix)

10. 希尔排序

时间复杂度 O(n^(1-2之间))
稳定性   不稳定
空间复杂度  O(1)

11. 小结



                                 





内容概要:本文详细介绍了计算机求职面试的内容、技巧和备战策略,涵盖技术面、项目面、行为面三大部分。技术面重点在于算法和计算机基础知识,包括操作系统、网络、数据库等方面,并强调掌握高频算法题的解题方法和技巧。项目面要求候选人能够提炼项目的深度与亮点,运用STAR法则结构化描述项目经历,突出技术难点和解决方案。行为面主要考察候选人的软实力,如沟通能力、团队协作和解决问题的能力。高效备战策略方面,建议分阶段复习,优化简历,利用各种资源进行模拟面试。实战技巧部分提供了沟通心态管理、白板代码实战以及薪资谈判的具体指导。最后,文章还指出了常见误区,如盲目刷题、过度包装项目和忽视非技术问题的回答。 适合人群:计算机专业的应届毕业生和有工作经验的求职者,特别是希望进入互联网大厂、外企或独角兽企业的技术人员。 使用场景及目标:①帮助求职者理解计算机岗位面试的核心内容和技术要求;②提供系统的备考计划和资源推荐,提高面试准备效率;③传授面试实战技巧,增强求职者的自信心和表现力;④提醒求职者避免常见误区,确保面试过程顺利。 阅读建议:本文内容详实,建议读者按照文中提供的步骤逐步实施,结合自身实际情况调整策略。同时,注重实践练习,多参与模拟面试,不断总结经验教训,以提升面试成功率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值