您的位置:

基于快速排序算法的C++排序函数

排序是计算机科学中最基本的问题之一。在计算机程序中,排序算法是最常用的算法之一。排序算法指定对一个大小为N的列表或数组进行重排某一顺序,通常为数字或字母的升序或降序。

一、快速排序是最稳定的排序算法

快速排序是最稳定的排序算法之一,也是最经典最常用的排序算法之一。主要思路是利用“分治法”的思想,将原序列逐步分解成多个子序列,最终将所有子序列的排序合并成整个序列的有序排列。

void quicksort(int* arr, const int left, const int right) {
    if (left < right) {
        int i = left, j = right, mid = arr[(i + j) / 2];
        while (i <= j) {
            while (arr[i] < mid) i++;
            while (arr[j] > mid) j--;
            if (i <= j) {
                swap(arr[i], arr[j]);
                i++;
                j--;
            }
        }
        quicksort(arr, left, j);
        quicksort(arr, i, right);
    }
}

快速排序的时间复杂度通常为O(nlogn),是排序算法中的高效算法之一。

二、为实现快速排序算法

下面是利用快速排序算法实现数组排序的C++代码:

#include <iostream>
using namespace std;

void quicksort(int* arr, const int left, const int right);

int main() {
    int arr[8] = {5, 3, 8, 6, 2, 7, 4, 1};
    int len = sizeof(arr) / sizeof(*arr);
    quicksort(arr, 0, len - 1);
    for (int i = 0; i < len; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

void quicksort(int* arr, const int left, const int right) {
    if (left < right) {
        int i = left, j = right, mid = arr[(i + j) / 2];
        while (i <= j) {
            while (arr[i] < mid) i++;
            while (arr[j] > mid) j--;
            if (i <= j) {
                swap(arr[i], arr[j]);
                i++;
                j--;
            }
        }
        quicksort(arr, left, j);
        quicksort(arr, i, right);
    }
}

三、待排序序列、合并排序和快速排序算法比较

待排序的序列是指未排序的序列,合并排序和快速排序算法是排序算法中常用的算法。

快速排序算法的时间复杂度为nlogn,而合并排序呢?在最坏的情况下,合并排序的时间复杂度为o(nlogn)。在最好的情况下,快速排序的时间复杂度为O(nlogn)。因此,它被称为最快的排序算法之一。

合并排序的时间复杂度的主要缺点是需要额外存储空间(O(N)),而快速排序不需要。然而,在实践中,它们的差异很小,并且它们比内部排序算法(例如,插入排序和选择排序)更快。

在大多数情况下,快速排序是最优的选择。

四、快速排序算法第一次排序

下面是快速排序算法第一次排序的C++代码:

#include <iostream>
using namespace std;

void quicksort(int* arr, const int left, const int right);

int main() {
    int arr[8] = {5, 3, 8, 6, 2, 7, 4, 1};
    int len = sizeof(arr) / sizeof(*arr);
    quicksort(arr, 0, len - 1);
    for (int i = 0; i < len; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

void quicksort(int* arr, const int left, const int right) {
    if (left < right) {
        int i = left, j = right, mid = arr[(i + j) / 2];
        while (i <= j) {
            while (arr[i] < mid) i++;
            while (arr[j] > mid) j--;
            if (i <= j) {
                swap(arr[i], arr[j]);
                i++;
                j--;
            }
        }
        quicksort(arr, left, j);
        quicksort(arr, i, right);
    }
}

五、快速排序是排序算法中最快的算法吗?

快速排序是最快的外部排序算法之一。但是,在内部排序中,它并不总是最快的,取决于序列的特征。在最坏情况下,快速排序的时间复杂度为O(n²),而合并排序的时间复杂度始终是O(nlogn)。

可以得到这样一个结论:在所有排序算法中,快速排序中使用的主元分割技术在平均情况下具有最好的性能,并且在大多数情况下是最优解的选择。另一方面,希尔排序通常用于数组中的小部分(例如,10或20)元素。

下面是快速排序算法的C++代码:

#include <iostream>
using namespace std;

void quicksort(int* arr, const int left, const int right);

int main() {
    int arr[8] = {5, 3, 8, 6, 2, 7, 4, 1};
    int len = sizeof(arr) / sizeof(*arr);
    quicksort(arr, 0, len - 1);
    for (int i = 0; i < len; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

void quicksort(int* arr, const int left, const int right) {
    if (left < right) {
        int i = left, j = right, mid = arr[(i + j) / 2];
        while (i <= j) {
            while (arr[i] < mid) i++;
            while (arr[j] > mid) j--;
            if (i <= j) {
                swap(arr[i], arr[j]);
                i++;
                j--;
            }
        }
        quicksort(arr, left, j);
        quicksort(arr, i, right);
    }
}

综上所述,快速排序算法是最快的外部排序算法之一,并且在内部排序算法中,虽然不总是最快的算法,但在大多数情况下是最优解的选择。