当前位置: 首页 > article >正文

快速排序进阶版(加入插入排序提高其性能)

如图所示,对于足够大的n,快速排序算法要比其他算法效率更高。令精确值为nbreak。当n<nbreak时,插入排序的平均性能最佳,而当n>nbreak时,快速排序的性能能最佳。

因此当n>nbreak时,我们可以把插入排序和快速排序综合为一个排序函数,可以提高快速排序的性能。 

在萨尼的《数据结构、算法与应用 c++语言描述》中:

if(l>=r) return;

 替换为

if (r - l <= nbreak) {
        insertion_sort(a, l, r);
        return;
}

原本的快速排序:

#include<bits/stdc++.h>
using namespace std;
void print_a(vector<int>& a){
    for(int i:a){
        cout<<i<<"";
    }
    cout<<endl;
} 
void quick_sort(vector<int> &a,int l,int r){
    if(l>=r) return;
    int i=l-1,j=r+1,x=a[(l+r)/2];
    while(i<j){
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j) swap(a[i],a[j]);
        cout<<"i="<<i<<" "<<"j="<<j<<" ";
        print_a(a);
    }
    quick_sort(a,l,j);
    quick_sort(a,j+1,r);

}

int main(){
    int n;
    cout<<"请输入n:"<<" ";
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    quick_sort(a,0,a.size()-1);
    print_a(a);
    return 0;
}

更新后的快速排序:

#include<bits/stdc++.h>
using namespace std;
void insertion_sort(vector<int>& a, int l, int r) {
    for (int i = l + 1; i <= r; i++) {
        int key = a[i];
        int j = i - 1;
        while (j >= l && a[j] > key) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = key;
    }
}
void print_a(vector<int>& a){
    for(int i:a){
        cout<<i<<"";
    }
    cout<<endl;
}
void quick_sort(vector<int> &a,int l,int r){
    if (r - l <= a.size()) {
        insertion_sort(a, l, r);
        return;
    }
    int i=l-1,j=r+1,x=a[(l+r)/2];
    while(i<j){
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j) swap(a[i],a[j]);
        cout<<"i="<<i<<" "<<"j="<<j<<" ";
        print_a(a);
    }
    quick_sort(a,l,j);
    quick_sort(a,j+1,r);

}

int main(){
    int n;
    cout<<"请输入n:"<<" ";
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    quick_sort(a,0,a.size()-1);
    print_a(a);
    return 0;
}

 

一般来说,当子数组的大小小于 10(这个值是可以根据具体情况调整的),使用插入排序会更有效率,因为插入排序对于小数组来说非常高效。在快速排序中加入一个小优化,当待排序的子数组的大小小于某个阈值时,使用插入排序来加速排序,这种方式称为“混合排序”。我们通过将小数组的排序任务交给插入排序来优化快速排序,这种方法可以减少递归深度,提高排序效率。


http://www.kler.cn/a/471609.html

相关文章:

  • 计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习
  • 【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
  • android 启动页倒计时页面编写
  • EyeSoothe: Your Ultimate Eye Health Companion
  • Spring Boot项目中使用单一动态SQL方法可能带来的问题
  • 行为模式10.职责链模式
  • 【代码随想录】刷题记录(93)-无重叠区间
  • Requests-数据解析bs4+xpath
  • UWB实操:用信号分析仪(频谱分析仪)抓取UWB频域的图像
  • 【JMeter】多接口关联
  • es 3期 第22节-Bucket特殊分桶聚合实战
  • 【往届已EI检索】第五届智慧城市工程与公共交通国际学术会议(SCEPT 2025)
  • 在 PhpStorm 中配置命令行直接运行 PHP 的步骤
  • 后端开发入门超完整速成路线(算法篇)
  • 计算机网络:无线网络
  • 矩阵和向量点乘叉乘元素乘
  • ue5 替换角色的骨骼网格体和动画蓝图
  • 计算机网络之---计算机网络的性能评估
  • Redis中的主从/Redis八股
  • 信息安全:Java自定义Jackson序列化器进行数据脱敏
  • 如何在新窗口打开pdf文件,并修改网页标题
  • 【前端系列02】Pinia状态管理库
  • 回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测
  • 云打印之快手打印组件交互协议
  • jenkins入门5 Manage Jenkins
  • PyQt5 UI混合开发,控件的提升