排序是软件开发中最常见的算法问题了,给出一组数据,按照要求对其进行排序,或是从小到大,或是从大到小。今天我们就用C++来实现冒泡排序的过程。
假设以从大到小的排序方式为例,假设共有N个数(A1......An):
1)依次比较数组中第一个值和后面的所有值,如果第一个数字小于后面的数字,交换两个数字,这样经过N-1次比较后 得到一个最的值在数组的最前面
2)接下来只需要将后面N-1个数排列即可,用第二个数和后面所有数比较,如果第二个数小于后面的数字,就进行交换,得到第二大的数字在第二位
3)重复上面的操作,直到只剩下一个最小的数完成排序
4)总共需要找N-1次最大的值即可完成排序
假设有 (1,3,5), 3个数需要从大到小排序,那么排序的过程就是,
首先1和3进行比较,1<3,需要交换 此时变成(3,1,5),
然后3和5进行比较,3<5,需要交换 此时变成(5,1,3),此时选出了最大值5
然后3和1进行比较,1<3,需要交换 此时变成(5,3,1),此时选出了第二大值3
最后只剩下一个1,结束排序(注意这里总共只需要找到2个最大值(N-1个) )
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
#include
using namespace std;
void printArray(int *arr,int len)
{
if (arr == NULL) {
return;
}
if (len <= 0) {
return;
}
for (int i =0 ; i < len; i++) {
cout<< arr[i] << "," ;
}
}
//冒泡排序实现 arr 整形数组,len 数组长度,desc 是否是降序排列
void PopSort(int *arr,int len,bool desc)
{
cout< arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
cout<< "排序过程";
printArray(arr,len);
cout<< endl;
}
}
}
int main(int argc, const char * argv[]) {
// insert code here...
//std::cout << "Hello, World!\n";
int a[10] = {1,3,6,34,67,12,98,32,23,55};
cout<< "降序排列:" ;
PopSort(a,10,true);
cout<
降序排列:
排列结果:98,67,55,34,32,23,12,6,3,1,
升序排列:
排列结果:1,3,6,12,23,32,34,55,67,98,
验证猜想
降序排列:
排序过程3,1,5,
排序过程5,1,3,
排序过程5,3,1,
排列结果:5,3,1,Program ended with exit code: 0
这里为了方便理解冒泡排序将排序的过程也打印了出来。
这里有两个不是很好理解的地方一个是for语句,一个是交换两个数组中的元素,为什么是这样的代码:
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
这是因为 = 是赋值操作,等号前面的值会被替换成等号后面的值,如果写成以下代码会导致两个元素都为arr[j]的值
arr[i] = arr[j];
arr[j] = arr[i];
如何理解呢,比如说现在有两个杯子,一杯装的82年拉菲,一杯装的是飞天茅台,现在由于服务员的粗心,将白酒杯和红酒杯弄错了,需要将两杯酒换过来,如果直接倒肯定不行了,这个时候需要拿出第三个杯子,先将其中一杯存在这个临时拿出的杯子里面,然后在完成交换,然后再把存入第三个杯子的酒,倒入空的杯子里面,完成交换。
for(变量;变量停止的条件;每次执行语句后的操作)
{
语句
}
for循环是非常常用的循环语句,一定要学会使用。for循环一般用于执行指定次数的循环,例如输出100次的 “我爱你”,如果你不嫌麻烦可以复制粘贴100次
cout<<"我爱你!C++"<
但是一个聪明的,正常的程序员,应该学会使用循环来简化代码
for(int i = 0;i< 100;i++)
{
cout<<"我爱你!C++"<