冒泡排序
我们在一组数据中,要将其数据进行排序,那么怎么做才好呢?我们一个用例子来举例(如以下图)
在这组数据中,如果我们要将从小到大的数据进行排序,应该怎么做做呢,这时候我们就可以用冒泡排序。
第一次交换
我们先用前面的元素来与后面的数据进行比较,如果比前面的大,那么就将其进行交换,然后再继续比较。
第二次交换
第三次交换
第四次交换
第五次交换
我们可以看到,经过五次之后,排序最大的已经在最后了,那么最后的那个数据便不再继续参与比较。
接下来我们用C/C++的代码来进行实现
代码实现
#include <iostream>
#include <Windows.h>
using namespace std;
void swap(int* num1, int* num2){ //交换两个指针所指向得的元素的值
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
//冒泡排序
void BubbleSort(int arr[], int len) {
for (int i = 0; i < len - 1; i++) {
bool sorted = true; //判断数据是否还进行交换
for (int j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(&arr[j], &arr[j + 1]);
sorted = false; //如果数据进行交换,那么sorted就为false
}
}
if (sorted) break; //如果数据不进行交换了,那么直接退出,不用再继续执行for循环了
}
}
int main(void) {
int a[] = { 163, 161, 158, 165, 171, 170, 164, 159, 162 };
int len = sizeof(a) / sizeof(a[0]);
BubbleSort(a, len);
cout << "----------冒泡排序后的顺序------------" << endl;
for (int i = 0; i < len; i++) {
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
运行程序的结果为如图
这样我们就实现了冒泡排序,而冒泡排序就是通过重复地遍历未排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢得像泡泡一样“浮”到数列的顶端,故而得名!
如果大家还是不理解,那么请看下面的数据.
int a[] = { 163, 161, 158, 165, 171, 170, 164, 159, 162 };
/*执行for循环第一次时数组的中的元素变为 161,158,163, 165, 170, 164, 159, 162 -- 171
* 执行for循环第二次时数组的中的元素变为 158, 161, 163, 165, 164, 159, 162 -- 170, 171
* 执行for循环第三次时数组的中的元素变为 158, 161, 163, 164, 159, 162 -- 165, 170, 171
* 执行for循环第四次时数组的中的元素变为 158, 161, 163, 159, 162 -- 164, 165, 170, 171
* 执行for循环第五次时数组的中的元素变为 158, 161, 159, 162 -- 163, 164, 165, 170, 171
* 执行for循环第六次时数组的中的元素变为 158, 159, 161 -- 162,163, 164, 165, 170, 171
*/
这样就完成了排序。