编辑代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void print_arr(vector<int>& arr){
    for (int i : arr) {
        cout << i << " ";
    }
}
 
//1 冒泡排序 
void bubbleSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                swap(arr[j], arr[j+1]);
            }
        }
    }
    print_arr(arr);
    std::cout << std::endl;
}

//2 选择排序
void selectionSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 0; i < n-1; i++) {
        int min_idx = i;
        for (int j = i+1; j < n; j++) {
            if (arr[j] < arr[min_idx]) {
                min_idx = j;
            }
        }
        swap(arr[min_idx], arr[i]);
    }
    print_arr(arr);
    std::cout << std::endl;
}

//3 插入排序
void insertionSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i-1;
        while (j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
    print_arr(arr);
    std::cout << std::endl;
}

//4 希尔排序
void shellSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int gap = n/2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }

    print_arr(arr);
    std::cout << std::endl;
}

//5 归并排序(Merge Sort)
void merge(std::vector<int>& arr, int l, int m, int r) {
    std::vector<int> L(arr.begin()+l, arr.begin()+m+1);
    std::vector<int> R(arr.begin()+m+1, arr.begin()+r+1);
    int i = 0, j = 0, k = l;
    while (i < L.size() && j < R.size()) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < L.size()) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < R.size()) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

void mergeSort(std::vector<int>& arr, int l, int r) {
    if (l < r) {
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}

void mergeSort(std::vector<int>& arr) {
    if (arr.size() > 1) {
        int l = 0;
        int r = arr.size() - 1;
        mergeSort(arr, l, r);
    }
    print_arr(arr);
    std::cout << std::endl;
}

//6 快速排序(Quick Sort)
int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);
    return (i + 1);
}

void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

void quickSort(std::vector<int>& arr) {
    if (arr.size() > 1) {
        int low = 0;
        int high = arr.size() - 1;
        quickSort(arr, low, high);
    }
    print_arr(arr);
    std::cout << std::endl;
}

//7 堆排序(Heap Sort)
void heapify(std::vector<int>& arr, int n, int i) {
    int largest = i;
    int l = 2*i + 1;
    int r = 2*i + 2;
    if (l < n && arr[l] > arr[largest]) {
        largest = l;
    }
    if (r < n && arr[r] > arr[largest]) {
        largest = r;
    }
    if (largest != i) {
        std::swap(arr[i], arr[largest]);
        heapify(arr, n, largest);
    }
}

void heapSort(std::vector<int>& arr) {
    int n = arr.size();
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    for (int i = n - 1; i > 0; i--) {
        std::swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
    print_arr(arr);
    std::cout << std::endl;
}

//8 计数排序(Counting Sort)
void countingSort(std::vector<int>& arr) {
    int n = arr.size();
    int max_val = *std::max_element(arr.begin(), arr.end());
    int min_val = *std::min_element(arr.begin(), arr.end());
    std::vector<int> count((max_val - min_val + 1), 0);
    for (int i = 0; i < n; i++) {
        count[arr[i] - min_val]++;
    }
    int idx = 0;
    for (int i = 0; i < count.size(); i++) {
        while (count[i] > 0) {
            arr[idx++] = i + min_val;
            count[i]--;
        }
    }
    print_arr(arr);
    std::cout << std::endl;
}

int main(){
	vector<int> arr = {1, 3, 0, 5, 8, 5};
	bubbleSort(arr);

	selectionSort(arr);

    insertionSort(arr);

    shellSort(arr);

    mergeSort(arr);

    quickSort(arr);

    heapSort(arr);

    countingSort(arr);

    return 0;
}