超详细的C++冒泡排序

超详细的C++冒泡排序,第1张

目录 1.从高位向低位的依次升序

2.从低位向高位的依次升序

3对于只要求最高位和最低位的简化方式

4降序的实现方式

5判断排序是否完成的方式


预先定义一个交换函数

int swap(int a,int b)
{

int temp=b;

b=a;

a=temp;

}
1.从高位向低位的依次升序

首先来看第一种

int bubble_sort_high(vector  vec)
{
	for (int i = 0;i < vec.size()-1;i++)//这里i vec[j + 1])
			{
				swap(vec[j], vec[j + 1]);
			}
		}
	}
}

这里如果输入的是3 2 4 1 5 那么先是3和2比较并交换,变成2 3 4 1 5;再是3和4交换,不变;第一轮j循环过后变成2 3 1 4 5;可以看到5在最高位,且之后的循环中只会到倒数第二位,不会与5进行比较使用这种方法最大值可以第一轮求出来
第二轮循环j最大只能是2;变成2 1 3 4 5
第三轮循环j最大只能是1;变成1 2 3 4 5
第四轮不改变顺序
这种方法是相邻的比较,最大值无论在哪里都会被交换到最高位,第一次就可以求出最大值
可以看到这种方法是从高位依次向下排序的

2.从低位向高位的依次升序
int bubble_sort_low(vector  vec)
{
	for (int i = 0;i < vec.size() - 1;i++)
	{
		for (int j = i+1;j < vec.size();j++)//这里j vec[j])
			{
				swap(vec[i], vec[j]);
			}
		}
	}
}

还是用3 2 4 1 5来举例子,首先是3和2比较变成2 3 4 1 5;然后是2和4进行比较不变,再是2和1进行比较变成1 3 4 2 5,再1和5进行比较,不变
所以第一次j循环之后顺序变成了1 3 4 2 5,可以清楚的看到最小的1已经放到了最低位,且之后从第二位开始,不会再和1进行判断
第二次循环从第二位开始 首先3和4比较不改变,再3和2进行比较交换得出1 2 4 3 5,再2和5进行比较不变
第三次循环首先比较4和3,交换,最后得到1 2 3 4 5;
第四次循环不改变顺寻
可以看到这种方法是从低位依次向上排好的

3对于只要求最高位和最低位的简化方式

在1的情况分析下如果我们只需要求最大值(让最大值去到最高位)可以简化成
 

int calculate_maximum(vector  vec)
{
	for (int j = 0;j < vec.size() - 1;j++)
	{
		if (vec[j] > vec[j + 1])
		{
			swap(vec[j], vec[j + 1]);
		}
	}
}

在2的情况分析下如果我们只需要求最小值(让最小值去到最低位)可以简化成

int calculate_minimum(vector  vec)
{
	for (int j = 1;j < vec.size();j++)//这里jvec[j])
		{
			swap(vec[0], vec[j]);
		}
	}
}

4降序的实现方式

如果是从大到小只需要改变上面各式子的交换条件将若大于交换改成若小于交换即可

如在1的中bubble_sort_high(vector vec)中将if (vec[j] > vec[j + 1])改成if (vec[j] < vec[j + 1])

5判断排序是否完成的方式

同时我们发现以上的式子存在一点小缺陷,即不可以判断排序是否完成,在排序完成后还会继续比较,造成一些计算浪费,为了解决这个问题,我们可以设计以下的方法判断排序是否完成,可以让我们提前结束循环
使用bool类型来判断是否排序完成,其原理为当一轮j循环不需要交换任何数是,每一个下一位的数都比上一位大,此时所有排序完成,不需要进行下一步的排序

!注意这种方法在2中的bubble_sort_low(vector vec)并不适用,如反例 1 2 3 5 4这个中开头是1

bool is_sorted = false;
	int bubble_sort_judge(vector  vec)
	{
		for (int i = 0;i < vec.size() - 1;i++)
		{
			is_sorted = true;
			for (int j = 0;j < vec.size() - 1 - i;j++)
			{
				if (vec[j] > vec[j + 1])
				{
					swap(vec[j], vec[j + 1]);
					is_sorted = false;
				}
			}
			if (is_sorted)
				break;
		}
	}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/676006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存