冒泡排序的实现
C++ 实现
- 常规写法:两层for循环,外层循环控制一共需要循环多少轮,内存循环控制每轮循环时,将未排序的最大元素放在合适的位置上。
- 优化写法1:数组本来是一个有序数组,或者在排序过程中,数组变成了完全有序的数组,那么将这种情况识别出来,中断循环。在开始内层循环时,记录下是否交互过元素,默认false,如果内存循环走完,一次都没有交换元素,则终止外层循环。
- 优化写法2:举例来说,数组中的后半段元素都是排好序的,把排好序的起始位置记录下来,后续内层循环走到已排序的起始位置,并且小于等于起始位置的元素,则停止内层循环。(待实现)
#include <stdio.h>
#include <vector>
using namespace std;
class BubbleSortExe {
public:
/// 常规写法
void sort(vector<int>& arr){
int size = (int)arr.size();
for (int i=0; i<size; i++) {
for (int j=0; j+1<size; j++) {
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
}
/// 优化写法1,如果数组已经是有序数组了,则中断后续的循环
void sort2(vector<int>& arr) {
int size = (int)arr.size();
for (int i=0; i<size; i++) {
/// 内存循环记录是否有交换数组元素,如果一次都没有,则结束
bool isSwapped = false;
for (int j=0; j+1<size; j++) {
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
isSwapped = true;
}
}
if (!isSwapped) {
break;
}
}
}
private:
void swap(vector<int>& arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
};