排序:即将一组混乱的数据按从小到大或者从大到小的顺序进行有序的排列出来。
冒泡排序算法图解:
思路解答:
从第一个数据开始,与其后一个数据进行比较,如果后面的数据比他小,则它两互相交换位置;然后再从第二个数据开始,与其后一个数据进行比交,如果后面的数据比他小,则它两互相交换位置;然后再从第三个数据开始…;如果有遇到后面的数据比它还要大的,则无需交换。
时间复杂度:O(n2)
代码实现:
void BubbleSort(int *arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
for (int j = 0; j < len - i - 1; j++) { // 后面的数据已经排好序,所以需要减去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比后面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
}
}
}
}
上面的代码是实现冒泡算法的一种方式,当然也还有特殊情况下效率高的算法。
例如需要将这一堆数据进行排序:{ 154, 155 , 157, 174, 162, 159, 160, 161, 171 }
深色的表示已经排好序了,后续就不需要再进行比较了!
第一次排序:154, 155, 157, 162, 159, 160, 161, 171, 174
第二次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
第三次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
可以看出,特殊情况,排序两次后就排好序了,所以我们再第三次排序确认没有数据再进行交换后,就说明这一组数据是已经排好序的了,就可以结束循环了!
改进后的冒泡排序算法代码:
void BubbleSort(int* arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
bool sorted = true; // 假如n次比较后已经排好序,但是他还没有走完循环,可以利用它来结束循环,效率提高
for (int j = 0; j < len - i - 1; j++) { // 后面的数据已经排好序,所以需要减去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比后面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
sorted = false; // 当有执行交换操作,赋值false
}
}
if (sorted) break; // 为真时,说明循环一轮后,没有执行交换操作,即已经排好序了,直接结束循环
}
}
此时,算法效率就大大提高了!!!
全部代码实现:
#include <iostream>
#include <Windows.h>
using namespace std;
void BubbleSort(int* arr, int len) {
for (int i = 0; i < len - 1; i++) { // 操作n-1次
bool sorted = true; // 假如n次比较后已经排好序,但是他还没有走完循环,可以利用它来结束循环,效率提高
for (int j = 0; j < len - i - 1; j++) { // 后面的数据已经排好序,所以需要减去i次
if (arr[j] > arr[j + 1]) { // 如果前面的比后面的要大
int ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
sorted = false; // 当有执行交换操作,赋值false
}
}
if (sorted) break; // 为真时,说明循环一轮后,没有执行交换操作,即已经排好序了,直接结束循环
}
}
int main(void) {
int beauties[] = { 154, 155 , 157, 174, 162, 159, 160, 161, 171 };
// 计算数组的元素个数
int len = sizeof(beauties) / sizeof(beauties[0]);
BubbleSort(beauties, len);
for (int i = 0; i < len; i++) {
cout << beauties[i] << ", ";
}
cout << endl;
system("pause");
return 0;
}
运行截图: