内嵌汇编与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

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


目录
相关文章
|
1月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
74 15
|
1月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
18天前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
40 4
|
2月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
40 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
5月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
179 67
|
3月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
105 10
|
3月前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
93 10
|
3月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
80 7
|
3月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
76 5
|
3月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
131 2
下一篇
oss创建bucket