排序算法:插入、希尔、选择、冒泡

目录

 一.插入排序

1.算法描述:

2.实现思路:

3.时间复杂度:

代码如下: 

二.希尔排序 (插入排序的优化升级)

1.算法描述:

2.实现思路:

3.时间复杂度: 

代码如下:  

三.选择排序

1.算法思想:

2.实现思路:

3.时间复杂度:

 代码如下:

 四.冒泡排序

1.算法思想:

2.实现思路:

3.时间复杂度:

 代码如下:


一.插入排序

1.算法描述:

假设排为升序,从第二个数据逐次向后遍历,遇到更小的数据时,就将其向后平移。

2.实现思路:

设定两个指针 i 和 q ;i 负责整体数据遍历,q 负责处理遇到更小数据的情况 。

3.时间复杂度:

   O(n^2) 

动态图解析:

代码如下: 

//插入排序
void insersort(int* pq, int k)
{
	for (int i = 1; i < k; i++)           (这里设定从下标为 1 处开始,默认至少两个数据)
	{
		for (int q = i; pq[q] < pq[q - 1]; q--)
		{
			swap(&(pq[q]), &(pq[q - 1]));
		}
	}
}

二.希尔排序 (插入排序的优化升级)

1.算法描述:

假设排为升序,希尔排序的算法思想与插入排序基本一致,都是依次遍历,遇到更小数据向后平移,但是插入排序每次遍历一个数据,我们称之为步长gap 为 1 , 所以当gap为 1 的时候,进行一次插入排序,就能得到我们想要的结果,可是当数据量庞大的时候,gap = 1的情况下,时间成本也随之升高。

所以希尔排序在gap = 1之前进行多次预排序,即引入gap = 6 ;gap = 4; gap = 3等多次插入排序,使得在进行gap = 1的最后一次插入排序前,随着gap 的值越来越接近1 ,原数据已经接近最后的排序结果 ,这样一来,gap = 1的插入排序的时间复杂度由原先的O(n^2),大幅缩减,特殊情况下,甚至可以降到O(n)的效果。

2.实现思路:

设定一个gap,依据原数据量,给定gap 不同的、依次减小的多个值,并以gap 作为步长进行多次插入排序,直至gap = 1的最后一次插入排序的完成。

3.时间复杂度: 

O(n^(1.3-2))

动态图解析:

代码如下:  

//希尔排序
void ShellSort(int* pq,int k )
{
	int gap = (k / 3) + 1;
	for (; gap >= 1;gap = (gap/3)+1)
	{
		int i = 0;
		for (int ki = 0; i < k-gap; i++)
		{
			int temp = pq[i+gap];
			for ( ki = i+gap; ki-gap >= 0; ki -= gap)
			{
				if (pq[ki-gap] < temp)
				{
					pq[ki] = pq[ki-gap];
				}
				else
					break;
			}
			pq[ki] = temp;
		}
		if (gap == 1)
			break;
	}
}

三.选择排序

1.算法思想:

第一次从待排序组中选出最小和最大值分别平移至排序组的首尾(假设排升序)

下一次排序组剔除上一组的最大和最小值,然后重复筛选出最大和最小值,以此类推

2.实现思路:

用两个变量(head,last)控制每次遍历的范围,用变量L进行遍历。

3.时间复杂度:

    O(n^2)

动图解析:

 代码如下:

//选择排序
void SelectSort(int* pq, int k)
{
	int min = 0, max = k - 1;
	int head = 0, last = k-1;
	for (int L = head; head<last;head++,last--)
	{
		L = head;
		for (min = head,max = last; L<=last;L++)
		{
			if (pq[L] < pq[min])
				swap(&pq[min], &pq[L]);
			if (pq[L] > pq[max])
				swap(&pq[max], &pq[L]);
		}
	}
}

 四.冒泡排序

1.算法思想:

将第一个和第二个元素比较,若第一个大于第二个(假设排升序),则交换,然后用第二个(大的)与第三个比较,若第三个大,则交换,以此类推,遍历到最后一个元素时,队尾一定是这组排序数中最大的元素,第二轮排序时将他剔除掉,找出第二大的元素,以此类推。

2.实现思路:

用变量tail 来设定每次遍历的范围,用变量L 来进行前后元素的比较

3.时间复杂度:

O(n^2)

动图解析:

 代码如下:

//冒泡排序
void BubbleSort(int* pq, int k)
{
	int tail = k - 1;
	int L = 0;
	for (; tail>0; tail--)
	{
		for (L = 0; L < tail; L++)
		{
			if (pq[L] > pq[L + 1])
				swap(&pq[L], &pq[L + 1]);
		}
	}
}

感谢观看!!!

 

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值