主要介绍冒泡排序的算法:
算法思想:冒泡排序分两轮循环,一次外循环和一次内循环,每次比较相邻的两个数,若前面的数大于后面的数则交换位置,依次比较,直到跟最后一个数比较,每次比较完后最大的那个数肯定会在最后面,然后去掉最后一个数,剩下的数再从头开始,依次比较。后面的同理,知道最后一个数,算法完毕。
举个例子
8 6 7 3 9 4 2 1 5
第一轮比较(外循环,内循环)8 6 7 3 9 4 2 1 5
8大于6,则交换位置 6 8 7 3 9 4 2 1 5
第二次比较(内循环)6 8 7 3 9 4 2 1 5
8大于7,交换位置 6 7 8 3 9 4 2 1 5
第三次比较 (内循环)6 7 8 3 9 4 2 1 5
8大于3,交换位置 6 7 3 8 9 4 2 1 5
第四次比较 (内循环)6 7 3 8 9 4 2 1 5
8小于9,则不交换位置 6 7 3 8 9 4 2 1 5
下面同理,直到最大数9拍到最后一个位置,第一次外循环结束,同时第八次内循环结束。
开始第二轮外循环等等;直到只剩最后一个数,结束算法。
分析:外循环的次数=元素总个数-1,内循环次数=元素总个数-外循环的次数-1;
下面给出源码:
#include<iostream>
#include<vector>
using namespace std;
//冒泡排序
void bubbleSort(vector<int>&a)
{
//总轮数为总元素个数减1
for (int i = 0; i < a.size() - 1; i++)
{
//内部比较数为总元素个数-循环次数-1
for (int j = 0; j < a.size() - 1 - i; j++)
{
if (a[j] > a[j + 1])//交换位置
{
swap(a[j], a[j + 1]);
}
}
}
}
int main()
{
vector<int>v = { 9,8,3,7,2,4,5,6,1 };
cout << "排序前:" << endl;
for (auto x : v)
{
cout << x << " ";
}
cout << endl;
bubbleSort(v);
cout << "排序后:" << endl;
for (auto x : v)
{
cout << x << " ";
}
cout << endl;
}