排序---快速排序的4次优化

前言

个人小记


一、代码

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_ARR 10000000
#define SCOPE 16
#define swap(a,b)\
{\__typeof(a) __c=a;\a=b,b=__c;\
}
#define TEST(func,arr,l,r)\
{\printf("test: %s\n",#func);\int n=r-l;\int* t=(int*)malloc(sizeof(int)*n);\memcpy(t,arr,n);\long long a=clock();\func(t,l,r);\long long b=clock();\if(check(t,n))printf("OK %lldms\n",(b-a)*1000/CLOCKS_PER_SEC);\else printf("FAIL\n");\free(t);\
}int check(int* t,int n)
{for(int i=1;i<n;i++){if(t[i-1]>t[i])return 0;}return 1;
}int* init_arr(int n)
{int* arr=(int*)malloc(sizeof(int)*n);for(int i=0;i<n;i++)arr[i]=rand()%10000000;return arr;
}void quick_sort(int* arr,int l,int r)
{if(r-l<=2){if(r-l<=1)return ;if(arr[l]>arr[r-1])swap(arr[l],arr[r-1]);return ;}int x=l,y=r-1,z=arr[l];while(y>x){while(y>x&&arr[y]>z)y--;if(y>x)arr[x++]=arr[y];while(y>x&&arr[x]<z)x++;if(y>x)arr[y--]=arr[x];}arr[x]=z;quick_sort(arr,l,x);quick_sort(arr,x+1,r);return ;
}void quick_sort_1(int* arr,int l,int r)
{if(r-l<=2){if(r-l<=1)return ;if(arr[l]>arr[l+1])swap(arr[l],arr[l+1]);return;}int x=l,y=r-1,z=arr[l];while(y>x){while(y>x&&arr[y]>=z)y--;if(y>x)arr[x++]=arr[y];while(y>x&&arr[x]<=z)x++;if(y>x)arr[y--]=arr[x];}arr[x]=z;quick_sort_1(arr,l,x);quick_sort_1(arr,x+1,r);return ;
}void quick_sort_v1(int *arr,int l,int r)
{if(r-l<=2){if(r-l<=1)return ;if(arr[l]>arr[l+1])swap(arr[l],arr[l+1]);return ;}int x=l,y=r-1,z=arr[l];do{while(arr[y]>z)y--;while(arr[x]<z)x++;if(x<=y){swap(arr[x],arr[y]);x++,y--;}}while(x<=y);quick_sort_v1(arr,l,y+1);quick_sort_v1(arr,x,r);
return ;
}int middle(int a,int b,int c)
{if(a>b)swap(a,b);if(a>c)swap(a,c);if(b>c)swap(a,c);return b;
}void quick_sort_v2(int *arr,int l,int r)
{if(r-l<=2){if(r-l<=1)return ;if(arr[l]>arr[l+1])swap(arr[l],arr[l+1]);return ;}int x=l,y=r-1,z=middle(arr[l],arr[r-1],arr[(l+r)/2+1]);do{while(arr[y]>z)y--;while(arr[x]<z)x++;if(x<=y){swap(arr[x],arr[y]);x++,y--;}}while(x<=y);quick_sort_v2(arr,l,y+1);quick_sort_v2(arr,x,r);
return ;
}void quick_sort_v3(int *arr,int l,int r)
{while(r>l){int x=l,y=r-1,z=middle(arr[l],arr[r-1],arr[(l+r)/2+1]);do{while(arr[y]>z)y--;while(arr[x]<z)x++;if(x<=y){swap(arr[x],arr[y]);x++,y--;}}while(x<=y);quick_sort_v3(arr,l,y+1);l=x;}
return ;
}void __quick_sort_v4(int *arr,int l,int r)
{while(r-l>SCOPE){int x=l,y=r-1,z=middle(arr[l],arr[r-1],arr[(l+r)/2+1]);do{while(arr[y]>z)y--;while(arr[x]<z)x++;if(x<=y){swap(arr[x],arr[y]);x++,y--;}}while(x<=y);__quick_sort_v4(arr,l,y+1);l=x;}
return ;
}void UC_insert_sort(int *arr,int l,int r)
{int min=l;for(int i=l;i<r;i++){if(arr[min]>arr[i])min=i;}while(min>l){swap(arr[min],arr[min-1]);min=min-1;}for(int i=l+2;i<r;i++){int j=i;while(arr[j]<arr[j-1]){swap(arr[j],arr[j-1]);j=j-1;}}return ;
}void quick_sort_v4(int *arr,int l,int r)
{__quick_sort_v4(arr,l,r);UC_insert_sort(arr,l,r);return ;
}int main()
{srand((unsigned)time(0));int* arr=init_arr(MAX_ARR);TEST(quick_sort,arr,0,MAX_ARR);//TEST(quick_sort_1,arr,0,MAX_ARR);TEST(quick_sort_v1,arr,0,MAX_ARR);TEST(quick_sort_v2,arr,0,MAX_ARR);TEST(quick_sort_v3,arr,0,MAX_ARR);TEST(quick_sort_v4,arr,0,MAX_ARR);free(arr);return 0;
}

二、测试结果

test: quick_sort
OK 856ms
test: quick_sort_v1
OK 868ms
test: quick_sort_v2
OK 895ms
test: quick_sort_v3
OK 964ms
test: quick_sort_v4
OK 791ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

父组件调用子组件方法(组合式 API版)

在 Vue 3 中&#xff0c;defineExpose 是一个用于在组合式 API (Composition API) 中暴露组件内部方法或属性的函数。它允许父组件通过 ref 引用子组件实例&#xff0c;并调用子组件暴露的方法或访问其属性。 以下是子组件和父组件如何使用 defineExpose 和 ref 的详细解释和示…

如何快速分析并将一个简单的前后端分离项目跑起来

一、前言 主要是前一段时间有小伙伴问我说自己刚入坑学后端不久&#xff0c;在开源网站上找了个简单的前后端分离项目&#xff0c;但是自己不会跑起来&#xff0c;让我给他说说&#xff0c;介于这玩意三两句话不是很好说清楚&#xff0c;而且不清楚那个小伙伴的知识到何种地步…

规则引擎LiteFlow发布v2.12.1版本,决策路由特性

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 标题其实是不准确的&#xff0c;了解过的会知道在LiteFlow的2.12.0已经有了决策路由的特性&…

【TB作品】MSP430 G2553 单片机口袋板,读取单片机P1.4电压显示,ADC,电压表

功能 读取P1.4电压&#xff0c;显示到口袋板显示屏&#xff0c;电压越高亮灯越多。 部分程序 while (1){ADC10CTL0 | ENC ADC10SC; // Sampling and conversion startLPM0;adcvalue ADC10MEM; //原始数据 0到1023adtest (float) adcvalue / 1024.…

【算法训练 day48 零钱兑换、完全平方数】

目录 一、零钱兑换-LeetCode 322思路实现代码问题总结 二、完全平方数-LeetCode 279思路实现代码问题总结 一、零钱兑换-LeetCode 322 Leecode链接: leetcode 322 文章链接: 代码随想录 视频链接: B站 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及…

每一个企业,都值得拥有自己专属的AI大模型!

前言 在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的科幻概念&#xff0c;而是成为了企业创新、转型、升级的必备工具。尤其是AI大模型&#xff0c;凭借其强大的数据处理能力和深度学习能力&#xff0c;正在为企业带来前所未有…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串序列判定(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串序列判定(100分) 🌍 评测功能需要订阅专栏后私信联系…

Leetcode:四数之和

题目链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;排序 双指针&#xff09; 主旨&#xff1a;类似于三数之和的解法&#xff0c;但需要多加一些限制&#xff0c;同时为了防止多个数组元素的相加之和出现整型溢出问题还要将整型…

基于python可伸缩JSON格式列表实现

对于消息体为一个json格式列表&#xff0c;列表长度变化的代码设计&#xff0c;如下实现可供参考。 1、python语言实现(直接取值) #codingutf-8n 2 # 行项目数 productCode [11111,222222,333333] unit [H06,H07,H08] qty [6,7,8] items []for i in range(0, n):item …

数据分析每周挑战——心衰患者特征数据集

这是一篇关于医学数据的数据分析&#xff0c;但是这个数据集数据不是很多。 背景描述 本数据集包含了多个与心力衰竭相关的特征&#xff0c;用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体&#xff0c;提供了广泛的生理和生活方式指标&a…

spring事务实现原理

Spring事务的实现原理主要是基于AOP&#xff08;面向切面编程&#xff09; 事务的开启与提交/回滚 开启事务&#xff1a;当Spring容器中的AOP代理检测到一个匹配的切点方法被调用时&#xff0c;它会首先开启一个新的事务或者加入到现有的事务中&#xff08;这取决于事务传播行…

【读脑仪game】

读脑仪&#xff08;Brain-Computer Interface&#xff0c;BCI&#xff09;游戏是一种利用脑电信号来控制游戏的新型交互方式。这类游戏通常需要专业的硬件设备来读取用户的脑电信号&#xff0c;并将这些信号转化为游戏中的控制信号。编写这样的游戏代码涉及到多个方面&#xff…

瀚高数据库相关设置

瀚高数据库相关设置 一、配置瀚高数据库局域网访问 需要修改两个文件&#xff1a;postgresql.conf和pg_hba.conf 1&#xff09;在postgresql.conf中找到下述配置&#xff0c;把listen_addresses前面的注释去掉&#xff0c;值修改为* # - Connection Settings -#listen_addresse…

IO进程线程(九)线程的同步 进程间通信

文章目录 一、 线程的同步&#xff08;一&#xff09;无名信号量sem1. 定义和初始化2.获取信号量3.释放信号量4. 销毁5. 使用示例 &#xff08;二&#xff09;条件变量1. 定义和初始化2. 获取条件变量3. 释放条件变量4. 销毁条件变量 二、进程间通信&#xff08;一&#xff09;…

web-上传项目文件夹到Git远程仓库

Git初识 概念&#xff1a;一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 检验成功 打开bash终端&#xff08;git专用&#xff09;命令…

12. MySQL 日志

文章目录 【 1. 日志的基本原理 】【 2. 错误日志 Error Log 】2.1 启动和设置错误日志2.2 查看错误日志2.3 删除错误日志 【 3. 二进制日志 Binary Log 】3.1 启动和设置二进制日志3.2 查看二进制日志3.3 删除二进制文件删除所有二进制日志删除小于指定编号的二进制日志删除创…

【vue3+pinia+uniapp项目问题:使用pinia状态管理时store的数据更新,模板渲染视图不能实时更新】

在这里选择不同的学校后&#xff0c;发现store里面的数据打印出来能更新&#xff0c;但是使用store的数据打印出来并未实时更新且渲染在模板上&#xff0c;必须手动刷新视图才能更新。 原因是因为使用了解构赋值传入参数 解决方法 1.使用computed 现在视图能进行实时更新…

分享一个 .Net core Console 项目使用 SqlSugar 的详细例子

前言 SqlSugar 是一款老牌的 .NET 开源 ORM 框架&#xff0c;性能高&#xff0c;功能全面&#xff0c;使用简单&#xff0c;支持 .NET FrameWork、.NET Core3.1、.NET5、.NET6、.NET7、.NET8、.NET9 等版本&#xff0c;线上论坛非常活跃&#xff0c;今天给大伙分享一个 .Net c…

查看远程桌面端口,查看服务器的远程桌面端口的方法

如果你正在寻找一种方法来检查服务器的远程桌面端口&#xff0c;那么请务必按照以下步骤操作&#xff0c;以确保准确且安全地获取所需信息。这不仅是一个技术问题&#xff0c;更是一个关于效率和安全性的重要议题。 首先&#xff0c;你需要明确&#xff0c;远程桌面端口通常是…

回溯算法之递增子数列

题目&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情…