Skip to content

排序算法

jiaxw32 edited this page Jun 6, 2020 · 4 revisions

冒泡排序

void bubbleSort(int arr[], int len){
    if (arr == nullptr || len == 0) {
        return;
    }
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {
                swap(arr[j], arr[j+1]);
            }
        }
    }
}

选择排序

void selectSort(int arr[], int len){
    if (arr == nullptr || len <= 0) {
        return;
    }

    for (int i = 0; i < len - 1; i++) {
        int min = i;
        for (int j = i + 1; j < len; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        if (min != i) {
            swap(arr[min], arr[i]);
        }
    }
}

插入排序

void insertSort(int arr[], int len){
    if (arr == nullptr || len <= 0) {
        return;
    }
    for (int i = 1; i < len; i++) {
        int j = i;
        int value = arr[i];
        while (j > 0 && arr[j-1] > value) {
            arr[j] = arr[j-1];
            --j;
        }
        if (j != i) {
            arr[j] = value;
        }
    }
}

快速排序

int partition(int arr[], int start, int end){
    if (arr == nullptr || start < 0 || start > end) {
        invalid_argument ex("invalid intput.");
        throw exception(ex);
    }

    int pivot = start + rand() % (end - start + 1);
    swap(arr[pivot], arr[end]);

    pivot = start -1;
    for (int i = start; i < end; i++) {
        if (arr[i] < arr[end]) {
            ++pivot;
            if (pivot != i) {
                swap(arr[pivot], arr[i]);
            }
        }
    }

    ++pivot;
    swap(arr[pivot], arr[end]);
    return pivot;
}

void quickSort(int arr[], int start, int end){
    if (arr != nullptr && start < end) {
        int pivot = partition(arr, start, end);

        if (pivot > start) {
            quickSort(arr, start, pivot -1);
        }

        if (pivot < end) {
            quickSort(arr, pivot + 1, end);
        }
    }
}

堆排序

void heapify(int arr[], int len, int root){
    int left = root * 2 + 1;
    int right = root * 2 + 2;
    int max = root;

    if (left < len && arr[left] > arr[max]) {
        max = left;
    }

    if (right < len && arr[right] > arr[max]) {
        max = right;
    }

    if (max != root) {
        swap(arr[max], arr[root]);
        heapify(arr, len, max);
    }
}

void heapSort(int arr[], int len){
    if (arr == nullptr || len <= 0) {
        return;
    }

    for (int i = len/2 -1; i >= 0; i--) {
        heapify(arr, len, i);
    }

    for (int i = len -1; i > 0; i--) {
        swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
}

归并排序

void merge(int arr[], int left, int mid, int right){
    int i, j, k;
    int leftLen = mid - left + 1;
    int rightLen = right - mid;

    int leftArr[leftLen];
    int rightArr[rightLen];
    for (i = 0; i < leftLen; i++) {
        leftArr[i] = arr[left + i];
    }

    for (j = 0; j < rightLen; j++) {
        rightArr[j] = arr[mid + 1 + j];
    }

    i = 0; j = 0; k = left;
    while (i < leftLen && j < rightLen) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            ++i;
        } else {
            arr[k] = rightArr[j];
            ++j;
        }
        ++k;
    }

    while (i < leftLen) {
        arr[k] = leftArr[i];
        ++i;
        ++k;
    }

    while (j < rightLen) {
        arr[k] = rightArr[j];
        ++j;
        ++k;
    }
}

void mergeSort(int arr[], int left, int right){
    if (arr != nullptr && left < right) {
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

计数排序

void countSort(int arr[], int len){
    if (arr == nullptr || len <= 0) {
        return;
    }

    int min = minValue(arr, len);
    int max = maxValue(arr, len);
    int range = max - min + 1;
    int countArr[range];
    memset(countArr, 0, sizeof(countArr));

    for (int i = 0; i < len; i++) {
        ++countArr[arr[i] - min];
    }

    for (int j = 1; j < range; j++) {
        countArr[j] += countArr[j-1];
    }

    int outputArr[len];
    for (int i = 0; i < len; i++) {
        outputArr[countArr[arr[i] - min] - 1] = arr[i];
        --countArr[arr[i] - min];
    }

    for (int i = 0; i < len; i++) {
        arr[i] = outputArr[i];
    }
}

参考资料

Clone this wiki locally