欢迎关注笔者,你的支持是持续更博的最大动力
问题描述
给n个数按从小到大排序 (冒泡排序)
思路
冒泡排序:把无序部分最大元素移动到有序部分第一个元素的左边。
1.一开始数列中所有元素都是无序的;
2.从最左开始往右,相邻无序元素两两比较,大的放右边,直到最后一对无序元素比完,使得最大无序元素放在无序部分最右边;
3.标记最右边的无序元素为有序元素,无序元素-1;
4.重复2~3操作;
…
直到没有无序元素。这样,大的元素就像水里气泡一样不断往上浮。
关于怎么换位置:
代码
代码思路
因为无序部分排序后,最右边的最大元素会被标记为有序,所以左边无序部分会缩短,右边有序部分会扩张,此消彼长,且有序部分不需要再排序,那么只要标记好无序和有序部分之间的三八线,只排序无序部分就好:
- 找到三八线,明确位置0~三八线内都是无序元素;
- 从位置0开始,把相邻无序元素两两排序,直到无序部分上限(最后一对的右边元素不超过三八线):
– 两两比较,大的放右边,小的放左边;
– 比较下一对;
- 把最右边的最大元素的位置,标记为新的三八线;
- 重复上述操作
void BubbleSort(int a[], int size){ //a[]:要排序的数组,size:数组大小,函数返回值:无,类型写void
for (int i = size-1; i > 0; --i) { //找三八线:i表示无序部分上限(图中最右边黄格子);由图可知,0~i为无序部分,i从size-1开始逐渐递减至1(最后一对要比较的是位置0和1的元素,上限是1,如果i为0,不会进入下层for循环)
for (int j = 0; j < i; ++j) { //给无序部分两两排序:j表示每一对左边元素的位置,所以j从0开始,最多到j=i-1(a[i-1]和a[i]),也就是j<i;如果j=i, 当i=size-1的时候,a[j+1]就是a[size],会超出数组范围,操作互换位置时候,会把数组外的内容弄进数组里面,导致排序出错
if (a[j] > a[j+1]){ //如果前面元素比后面元素大,互换位置:
int tmp = a[j+1]; //先把右边元素放到临时位,空出右边位置
a[j+1] = a[j]; //再把左边大的元素放到右边
a[j] = tmp; //把临时位里原右边元素放到左边
}
}
}
}
//用冒泡排序函数BubbleSort给 3 2 1 5 排序, 输出: 1 2 3 5
int main(){
int a[] = {3,2,1,5};
BubbleSort(a, 4);
for (int i = 0; i < 4; ++ i) {
cout << a[i] << " ";
}
}
相关内容
其他
日常vlog: 点这里去B站~