冒泡,插入,選擇,歸併,快速排序的C++實現

#include <iostream>
#include <ctime>
using namespace std;

void bubbleSort(int *arr, int len) {
    if(arr == NULL) return;
    for (int i = 0; i < len; ++i) {
        int sorted_flag = 1;
        for (int j = 0; j < len - i - 1; ++j) {
            if(arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                sorted_flag = 0;
            }
        }
        if(sorted_flag == 1) break;
    }
}

void insertSort(int* arr, const int len) {
    if(arr == NULL) return;
    for (int i = 0; i < len; ++i) {
        int j;
        int temp = arr[i];
        for (j = i; j > 0 ; --j) {
            if(arr[j-1] > temp) {
                arr[j] = arr[j-1];
            } else {
                break;
            }
        }
        arr[j] = temp;
    }
}

void selectSort(int * arr, const int len) {
    if(arr == NULL) return;
    for (int i = 0; i < len; ++i) {
        int min_index = i;
        for (int j = i+1; j < len; ++j) {
            if(arr[min_index] > arr[j]) min_index = j;
        }
        int temp = arr[min_index];
        arr[min_index] = arr[i];
        arr[i] = temp;
    }
}

int quickSort(int * arr, int left, int right) {
    int l = left, r = right, key = arr[left];
    while(l < r) {
        while(l <= r && arr[l] <= key) l ++;
        while(r >= l && arr[r] >= key) r --;
        if(l < r) {
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
        }
    }
    if(l == r || r == l-1) {
        arr[left] = arr[r];
        arr[r] = key;
    }
    return r;
}

void partition(int arr[], int left, int right) {
    if(arr == NULL || left >= right) return;
    int mid = quickSort(arr, left, right);
    partition(arr, mid + 1, right);
    partition(arr, left, mid - 1);
}

void mergeSort(int n[], int start, int end, int* temp) {
    if(n == NULL) return;
    if(start < end) {
        int mid = (start + end) >> 1;
        if(mid != start) {
            mergeSort(n, start, mid, temp);
            mergeSort(n, mid+1, end, temp);
        }

        for(int i = 0, l = start, r = mid+1; i <= end; i++) {
            if (r > end || l <= mid && n[l] <= n[r])
                temp[i] = n[l++];
            else
                temp[i] = n[r++];
        }
        for (int i = start; i <= end; ++i) {
            n[i] = temp[i - start];
        }

    }
}

void before_print(int * arr, const int len) {
    cout << "before sorting: ";
    for (int j = 0; j < len; ++j) {
        cout << arr[j] << ' ';
    }
    cout << endl;
}

void after_print(int * arr, const int len) {
    cout << "after sorting: ";
    for (int j = 0; j < len; ++j) {
        cout << arr[j] << ' ';
    }
    cout << endl;
}

int main() {
    srand((unsigned) time(0));
    const int len = 50;
    const int factor = len * 5;
    int * arr = new int[len];
    for (int j = 0; j < len; ++j) {
        arr[j] = rand() % factor;
    }

    before_print(arr, len);
    int *temp = new int[len];
    mergeSort(arr, 0, len-1, temp);
    after_print(arr, len);


    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章