计算机系统应用教程网站

网站首页 > 技术文章 正文

比较排序算法:合并排序与std::sort与。快速排序

btikc 2024-09-12 11:55:18 技术文章 9 ℃ 0 评论

在编程领域,排序算法在高效组织数据方面发挥着根本性的作用。

  • 排序算法是编程中高效数据处理的支柱。最近,我对三种著名的排序算法进行了深入的性能比较:Merge Sort、std::sort(标准库在C++中的排序)和Quick Sort。使用的测试数据集从1,000,000到10,000,000个元素不等。

调试构建:

  • 合并排序10,000,000个元素所花费的时间:12.9444秒
  • Time taken to std::sort 10,000,000 elements: 2.3612 seconds
  • 快速排序10,000,000个元素所花费的时间:4.88829秒

发布构建:

  • 合并排序10,000,000个元素所花费的时间:1.59478秒
  • Time taken to std::sort 10,000,000 elements: 0.458386 seconds
  • 快速排序10,000,000个元素所花费的时间:1.10305秒

不出所料,带有优化的发布构建显著缩短了所有排序算法的执行时间:

结论

  • 优化性能:结果强调了为性能关键型应用程序优化代码的重要性。发布版本及其优化提供了明显更快的执行时间,使其更适合生产就绪的可执行文件。
  • 算法选择:在选择排序算法时,std::sort作为一个高效可靠的选项脱颖而出,特别是对于大型数据集。快速排序也表现良好,展示了其在发布构建中的有效性。
  • 权衡:在选择排序算法时,必须考虑执行时间和算法复杂性之间的权衡。Whilestdstd::sort和Quick Sort更快,在稳定性或可预测性能至关重要的场景中,Merge Sort可能仍然更可取。

总之,带有优化的发布构建为排序算法提供了实质性的性能改进,展示了编译器优化对代码效率的影响。这种比较凸显了理解算法性能和优化技术对开发高效和可扩展应用程序的重要性。

合并排序

void merge(std::vector<int>& arr, int left, int middle, int right) {
    int n1 = 中间 - 左 + 1;
    int n2 = 右 - 中间;

    std::vector<int> L(n1),R(n2);

    对于(int i = 0;i < n1;i++)
L[i] = arr[左 + i];
    对于(int j = 0;j < n2;j++)
R[j] = arr[中间 + 1 + j];

    int i = 0;
    int j = 0;
    int k = 左;

    while (i < n1 && j < n2) {
        如果 (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} 否则 {
arr[k] = R[j];
j++;
}
k++;
}

    while (i < n1) {
arr[k] = L[i];
i++;
k++;
}

    while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}

void mergeSort(std::vector<int>& arr, int left, int right) {
    如果(左<右){
        int middle = left + (right - left) / 2;

        合并(arr,左,中间);
        mergeSort(arr,中间+1,右);
        合并(arr,左,中,右);
}
}

std::sort


std::sort(numbers2.begin(), numbers2.end());

快速排序


void swap(int& a, int& b) {
    int temp = a;
a = b;
b = 温度;
}

int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[高];
    int i = 低 - 1;

    for (int j = low; j <= high - 1; ++j) {
        if (arr[j] < pivot) {
i++;
            交换(arr[i],arr[j]);
}
}

    交换(arr[i + 1],arr[高]);
    返回i + 1;
}

void quickSort(std::vector<int>& arr, int low, int high) {
    如果(低<高){
        int pi = 分区(arr,低,高);

        quickSort(arr,low,pi - 1);
        quickSort(arr,pi + 1,高);
}
}

输出


Main.cpp


int main() {

    std::vector<int>数字(10000000);
    for (int i = 0; i < 10000000; ++i) {
数字[i] = rand();
}

    std::vector<int> numbers2(numbers);
    std::vector<int>数字3(数字);

    //合并排序

    自动启动 = std::chrono::high_resolution_clock::now();

    mergeSort(numbers,0,numbers.size()-1);

    自动结束 = std::chrono::high_resolution_clock::now();

std::chrono::duration<double> elapsed_seconds = end - start;

std::cout << "时间合并排序 : "<<numbers.size()<<" elements: " << elapsed_seconds.count() << " seconds" << std::endl;

    //std::sort

    auto start2 = std::chrono::high_resolution_clock::now();

std::sort(numbers2.begin(), numbers2.end());

    auto end2 = std::chrono::high_resolution_clock::now();

std::chrono::duration<double> elapsed_seconds2 = end2 - start2;

std::cout << "Time taken to std::sort : "<<numbers2.size()<<" elements: " << elapsed_seconds2.count() << " seconds" << std::endl;

    // 快速排序
    auto start3 = std::chrono::high_resolution_clock::now();

    quickSort(numbers3,0,numbers3.size()-1);

    auto end3 = std::chrono::high_resolution_clock::now();

std::chrono::duration<double> elapsed_seconds3 = end3 - start3;

std::cout << "Time taken to quicksort : "<<numbers3.size()<<" elements: " << elapsed_seconds3.count() << " seconds" << std::endl;

    返回0;
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表