冒泡排序

149 阅读1分钟

冒泡排序的实现

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;
    }
};