目录 1.从高位向低位的依次升序
预先定义一个交换函数
int swap(int a,int b)
{
int temp=b;
b=a;
a=temp;
}
1.从高位向低位的依次升序
首先来看第一种
int bubble_sort_high(vector <int> vec)
{
for (int i = 0;i < vec.size()-1;i++)//这里i<size-1是为了少一轮循环,如果没有-1,i取到size-1,那么下一个j循环都不满足循环条件
{
for (int j = 0;j < vec.size() - 1 - i;j++)
{
if (vec[j] > 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 <int> vec)
{
for (int i = 0;i < vec.size() - 1;i++)
{
for (int j = i+1;j < vec.size();j++)//这里j<size是为了让j能够等于size-1,因为这里没有上一个排序方法的j+1
{
if (vec[i] > 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 <int> 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 <int> vec)
{
for (int j = 1;j < vec.size();j++)//这里j<size是为了让j能够等于size-1,因为这里没有上一个排序方法的j+1
{
if (vec[0] >vec[j])
{
swap(vec[0], vec[j]);
}
}
}
4降序的实现方式
如果是从大到小只需要改变上面各式子的交换条件将若大于交换改成若小于交换即可
如在1的中bubble_sort_high(vector <int> vec)中将if (vec[j] > vec[j + 1])改成if (vec[j] < vec[j + 1])
5判断排序是否完成的方式
同时我们发现以上的式子存在一点小缺陷,即不可以判断排序是否完成,在排序完成后还会继续比较,造成一些计算浪费,为了解决这个问题,我们可以设计以下的方法判断排序是否完成,可以让我们提前结束循环
使用bool类型来判断是否排序完成,其原理为当一轮j循环不需要交换任何数是,每一个下一位的数都比上一位大,此时所有排序完成,不需要进行下一步的排序
!注意这种方法在2中的bubble_sort_low(vector <int> vec)并不适用,如反例 1 2 3 5 4这个中开头是1
bool is_sorted = false;
int bubble_sort_judge(vector <int> 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;
}
}