内嵌汇编与C/C++实现的冒泡排序,快速排序算法排序500W个数据对比

简介: 内嵌汇编是微软为了提高程序的直接操作硬件能力,以及实现大任务程序效率的提高,而嵌入在VC中的,他不依赖于汇编器对内嵌汇编代码进行汇编,这些内嵌汇编代码由C编译器内部实现,可以使程序好像自陷到汇编状态一样。

内嵌汇编是微软为了提高程序的直接操作硬件能力,以及实现大任务程序效率的提高,而嵌入在VC中的,他不依赖于汇编器对内嵌汇编代码进行汇编,这些内嵌汇编代码由C编译器内部实现,可以使程序好像自陷到汇编状态一样。这意味着你如果在C/C++程序中使用了 inline  asm进行 汇编 那么 就注定无法跨平台的,对于没有汇编基础的同学是需要去学习下王爽的8086汇编程序设计。,因为有些时候C++程序员是不得不懂这些东西的 ,否则你永远无法知道编译器为你的函数做了什么,.你还有哪些地方需要优化, 不管处于什么目的  我感觉 作为C++程序员 是需要懂得的。

身边的一位大哥给我讲,用汇编不一定会比C/C++要快 这一点我很同意 。所以说程序的效率不单单是所操作的语言层次决定,更多的是程序编写者的代码的质量的高低决定。

内嵌汇编 在C/C++中  通过

实际发现  500W条数据  排序结果如下:

算法名称    内嵌汇编算法时间        C/C++算法 时间  

冒泡排序    5W数据  慢的要死                  5W数据 慢的要死

快速排序      600ms左右                            500ms左右       

------------------为啥会出现快速排序算法,汇编出来的结果还没有C/C++效率高呢,原因就是我写的内嵌汇编没有编译器自动生成的效率高.

也就是代码质量不高的缘故 。。~~

_asm
{
   ...
}
_asm  ....

引入汇编代码,可以使程序自陷入汇编状态,MMX汇编指令被大量应用于处理媒体引用中。。

下面是冒泡排序代的内嵌汇编实现函数:

时间复杂度 最好  T(n)=O(n)~O(n*n)  稳定算法   

#define SIZE   10  
void SortBubble(int arr[],int sizen)
{
	int   *p;  
	p=arr-1;   //&a[0]-1 
	__asm  
	{  
		mov   esi,p;  
		mov   ecx,sizen;  
_outter:  
		mov   edx,ecx;
_inner:  
		cmp edx,ecx    ;去掉相等情况
		jz  _exchange_no
		mov   eax,[esi+ecx*4];  ;在函数内部不可以直接通过数组下标获取传递的数组 只能通过指针 进行寻址
		mov   ebx,[esi+edx*4 ];  
		cmp   eax,ebx;  
		jnb   _exchange_no;  
		mov   [esi+ecx*4],ebx;   ;交换连个元素 
		mov   [esi+edx*4],eax;  
_exchange_no:  
		dec   edx;  
		jnz   _inner;  
		loop   _outter;  
	}  
}

冒泡排序结果如图



用内嵌汇编实现快速排序算法

//堆栈中 内存地位先存  栈由高地址向低地址延伸 
//esp -xxx
//注意参数名字不要和内嵌汇编 关键字冲突
void  QuickSortAsm(int arr[],int lowIndex,int highIndex)
{  
    int*p=arr;  //为了寻址方便
    int  begin; //
    int  end; //
    __asm
    {  
        //;mov eax,[ebp+16] 堆栈高地址向低
       //使用寄存器 
       mov   eax,lowIndex  ;index first
       mov   ebx,highIndex ;index last
       cmp   eax,ebx  ;退程序  
       jg    _exit_func  
       mov   esi,p         ;存储数组地址-1用于寻址使用
       mov   edx,[esi+4*eax]          ;存放key
_outer:cmp   eax,ebx           ; 如果index first >index end 
       jnb   _endLable         ;  不符合条件退出                        
_find1: cmp   eax,ebx           ;进入第一层循环
       jnb   _inner1           ;条件1
       ;从后寻找第一个小于key的值 
       cmp   [esi+4*ebx],edx  ;从后面开始比较数组元素和edx
       jb    _inner1          ;找出右边第一个小于key的数组元素
       sub   ebx,1            ;last index -1  last=last-1
       jmp  _find1            ;跳转到循环头
_inner1:
       mov ecx,[esi+4*ebx]    ;找到小于交换值 
       mov [esi+4*eax],ecx
_find2: cmp   eax,ebx           ;进入第一层循环
        jnb   _inner2           ;条件1
        ;从后寻找第一个小于key的值 
        cmp   [esi+4*eax],edx  ;从左边找第一个大于key的元素 
        jg    _inner2          ;针对有符号数
        add   eax,1            ;first index+1  
        jmp  _find2            ;跳转到循环头
_inner2:
       mov ecx,[esi+4*eax]     ;将第一个大于的 和 轴交换
       mov [esi+4*ebx],ecx
       jmp _outer;
_endLable:
       mov [esi+4*eax],edx  ;轴复位  
       ///进行递归   参数自由向左
       mov  begin,eax ;
       mov  end,ebx   
    }
//  QuickSortAsm(arr,lowIndex,begin-1);
//     QuickSortAsm(arr,begin+1,highIndex);
    _asm
    {
        mov    ecx,begin  ; 递归1
        sub    ecx,1      ;index -1 
        push   ecx        ;
        mov    edx,lowIndex ;  
        push   edx  
        mov    eax,arr
        push   eax  
        call        QuickSortAsm
        add         esp,0Ch    ;堆栈平衡
        mov         ecx,highIndex  ;递归2
        push        ecx  
        mov         edx,begin  
        add         edx,1  
        push        edx  
        mov         eax,arr  
        push        eax  
        call        QuickSortAsm 
        add         esp,0Ch   ;恢复堆栈

    }
_exit_func: 
    return ;
}

如图



冒泡排序算法的C/C++实现:

// 时间复杂度 最好  T(n)=O(n)~O(n*n)  稳定算法   
void  SortBubbleC(int arr[],int sizen)
{
     bool flag=true ;//若无交换 直接退出
     int tem;
     for(int i=0;i<sizen-1&flag;i++)
     {   
         flag=false ;
         for(int j=0;j<sizen-i-1;j++) //内序冒泡
         {   
             if(arr[j]>arr[j+1])
             {   
                 flag=true ;
                 tem=arr[j];
                 arr[j]=arr[j+1];
                 arr[j+1]=tem;
               
             }
         }
  
     }
}

如图



C/C++快速排序算法的实现

//C/C++的快速排序 
void  QuickSortC(int arr[],int low,int high)
{
    if(low>high)
		return ;
	int begin=low ,end=high,key=arr[low];
	while(begin<end)
	{
		while(begin<end&&arr[end]>=key)
			--end;
		arr[begin]=arr[end];
		while(begin<end&&arr[begin]<=key)
			++begin;
		arr[end]=arr[begin];
	}
	arr[begin]=key ;
	QuickSortC(arr,0,begin-1);
	QuickSortC(arr,begin+1,high);
}





QQ 4223665 技术交流群  387761601

欢迎大家一起交流学习软件技术!


目录
相关文章
|
20天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
64 8
|
20天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
58 7
|
27天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
27天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
2月前
|
搜索推荐
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
|
2月前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
31 5
|
1月前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
35 0
|
2月前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
2月前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
5天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
19 2