常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比

排序算法 C++ 实现对比:10种经典排序在 10000 数据量下的性能实测 本文通过C++实现了10种经典排序算法,包括冒泡排序、快速排序和归并排序等,并在10000个随机数据规模下进行性能测试。测试结果显示,快速排序平均耗时仅3.2ms,表现最优。文章详细分析了各算法的时间复杂度、空间复杂度和稳定性,为考研408数据结构和算法学习提供了实用参考。 阅读详情

     偶然在书上看到句话,“为C++程序员所津津乐道的一件事,就是sort()全面打败c语言的quicksort”,于是决定亲自测试下,正好将其他的排序也一并测试了,当做当初没写的补偿吧。

     测试文件的一些说明:

    1、 测试中如果用数组,当MAX达到1000000时,会stack over,所以这里全部用了vector。

    2、随机数用一个全局vector保存,单独排序时直接vector<int> v(orited),就这但来说c++确实很方便啊,因为有的递归调用,调用过程中vector为多大都不确定,用数组怎么初始化就成为了一个问题。

    3、测试排序的函数命名全部为下划线分割的方式,如select_sort()。

    4、排序结果经过写入文件验证。

    5、文件在win7,vs6,vs08,以及gcc下编译通过。vs08下,最初用的文件操作用FILE,会有错,可以加以修改为stream,比如打开和判空修改如下:

FILE *fp =fopen("data.txt","wr");
ofstream fp("data.txt");
if (fp==NULL)
if (fp.fail())
写入文件两个的对应部分,当然读出的时候 ip >> temp; v.push_back(temp);即可
fp << orited[i] << " ";//这里最好加上个空格,不然文件中连起来的数字也没意义
fprintf(fp,"%d ",orited[i]);
//关闭
//	fclose(fp);
	fp.close();


    最终修改的标准c++测试文件如下

//============================================================================
// Name        : sort.cpp
// Author      : xia
// Version     : 1.0
// Copyright   : NUAA
// Description : 各种排序算法的比较(冒泡,选择,快速,希尔,堆,归并以及algorithm的sort)
//============================================================================
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <ctime>
using namespace std;

const int MAX = 1000;//当MAX为一百万,用数组会stack overflow,所以全部用vector
vector<int> orited;//全局原始未排序vector

void randNum()
{//产生随机数存于vector
	ofstream fp("data.txt");
	if (fp.fail())
	{
		cout << "open data error " << endl;
		exit(EXIT_FAILURE);
	}
	srand((unsigned)time(NULL));
	for (int i=0 ; i<MAX ; i++)
	{
		orited.push_back(rand()); //是用vector保存随机数
		fp << orited[i] << " ";
	}
	fp.close();
}
/************************************************************************/
/*     快速排序                                                         */
/************************************************************************/
int Partion(vector<int> &v ,int low ,int high)
{//对vector进行划分,返回枢轴下标
	int pivotkey;
	pivotkey = v[low] ;
	while ( low < high )
	{
		while (low < high && v[high] >= pivotkey)
			high -- ;
		v[low] = v[high];
		while (low < high && v[low] <= pivotkey )
			low ++ ;
		v[high] = v[low];	
	}
	v[low] = pivotkey ;
	return low ;
}
void quickSort(vector<int> &number ,int left ,int right)
{//用引用解决传参问题,以下类似
	if ( left < right )
	{
		int i = Partion(number , left, right) ; 
		quickSort(number, left, i-1);   // 对左边进行递归 
		quickSort(number, i+1, right);  // 对右边进行递归 	
	}
}
void quick_sort()
{//快速排序测试程序
	double start ,end ;
	vector<int> v(orited);//直接用全局orited初始化v
	start = clock() ;
	quickSort(v,0,MAX-1);
	end = clock();
	cout << "quick  sort cost : " << end - start << endl;
}
/************************************************************************/
/*      插入排序                                                        */
/************************************************************************/
void InsertSort(vector<int> &v)
{ //对vector做插入排序
	int i,j;
	int key;
	for(i=1 ; i < v.size() ; i++)
		if ( v[i] < v[i-1] )// "<",将v[i]插入有序子表 
		{
			key = v[i]; 
			for( j=i-1 ; key < v[j] ; j-- )
				v[j+1] = v[j]; // 记录后移 
			v[j+1] = key; // 插入到正确位置 
		}
}
void insert_sort()
{
	vector<int> v(orited);
	double start ,end;
	start = clock();
	InsertSort(v);
	end = clock();
	cout << "insert sort cost : " <<  end - start << endl;
}
/************************************************************************/
/*     algorithm的sort方法                                              */
/************************************************************************/
void vector_sort()
{
	double start ,end ;
	vector<int> v(orited);
	start = clock();
	sort(v.begin(),v.end());
	end = clock();
	cout << "vector sort cost : " << end - start << endl;
}
/************************************************************************/
/*        冒泡排序                                                      */
/************************************************************************/
void bubble_sort()
{
	int i,j;
	vector<int> v(orited);
	double start ,end;

	start = clock();
	for ( i=0 ; i< MAX ; i++)
	{
		for (j=i+1 ; j< MAX ; j++)
		{
			if (v[i] > v[j])//最小的往左冒泡
			{
				swap(v[i],v[j]);
			}
		}
	}
	end = clock();
	cout << "bubble sort cost : " <<  end - start << endl;
}
/************************************************************************/
/*      选择排序                                                        */
/************************************************************************/
void select_sort()
{
	int i,j,min;
	vector<int> v(orited);
	double start ,end;
	start = clock();
	for (i=0 ; i< MAX ; i++)
	{
		min = i ;
		for (j=i+1 ; j<MAX ; j++)
		{
			if (v[j] < v[min])
				min = j;
		}
		if (min != i)
			swap(v[i],v[min]);
	}
	end = clock();
	cout << "select sort cost : " <<  end - start << endl;
}
/************************************************************************/
/*     归并排序                                                         */
/************************************************************************/
void Merge(vector<int> &array,int start ,int mid ,int end)
{//合并vector的start-mid和mid-end两段
	int j,k,l;
	vector<int> temp(array); //引入temp,方便用array作为汇总
	for( j=mid+1,k=start ; start<=mid&&j<=end ; k++ ) 
	{
		if ( temp[start] < temp[j] )
			array[k] = temp[start++];
		else
			array[k] = temp[j++];
	}
	if( start <= mid )
	{
		for( l=0 ; l <= mid-start ; l++)
			array[k+l] = temp[start+l]; //将剩余0至min-start的复制到array
	}
	if( j <= end )
	{
		for( l=0 ; l<=end-j ; l++ )
			array[k+l]= temp[j+l]; //复制j至end到array
	}
}
void MergeSort( vector<int> &v, int low ,int high )
{
	if (low < high)
	{		
		int mid = ( low + high )/2; //平分
		MergeSort( v , low , mid ); //递归合并低段
		MergeSort( v , mid+1 , high ); //递归合并高段
		Merge( v , low , mid , high ) ; //合并排序后两段
	}
}
//归并排序的测试函数
void  merge_sort()
{
	vector<int> v( orited );
	double start ,end;
	start = clock();
	MergeSort(v,0,MAX-1);
	end = clock();
	cout << "merge  sort cost : " <<  end - start << endl;
}
/************************************************************************/
/*      希尔排序                                                        */
/************************************************************************/
const int SORTCOUNT = 20;//希尔排序的排序次数
const int dlta[SORTCOUNT] = {2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3};//增量数组
void ShellInsert(vector<int> &v , int dk)
{//对v做一趟shell插入排序,增量为dk,不是1;j<=0时,找到插入位置
	int i,j;
	for ( i=dk ; i < v.size() ; i++)
	{
		if (v[i] < v[i-dk])
		{
			int temp = v[i];//暂存
			for (j=i-dk ; j>0 && temp < v[j] ; j -= dk)
				v[j+dk] = v[j] ;//记录后移,查找插入位置 
			v[j+dk] = temp; //插入
		}
	}
}
void ShellSort(vector<int> &v ,const int dlta[] ,int t)
{//希尔排序
	for (int k=0 ; k < t ; k++)
		ShellInsert(v,dlta[k]) ;//一趟增量为dlta[k]的插入排序
}
void shell_sort()
{
	vector<int> v( orited );
	double start ,end;
	start = clock();
	ShellSort(v,dlta,SORTCOUNT);
	end = clock();
	cout << "shell  sort cost : " <<  end - start << endl;	
}
/************************************************************************/
/*       堆排序                                                         */
/************************************************************************/
void HeapAdjust(vector<int> &v ,int s ,int m)//将堆用数组表示,此处为vector
{//调整为大顶堆
	int rc,j;
	rc = v[s];
	for ( j=2*s ; j<= m ; j *= 2 )
	{//沿key较大的孩子结点向下筛选
		if (j<m && v[j] < v[j+1])
			j++ ;//j为key较大的记录的下标 
		if ( rc >= v[j] )
			break;// rc应插入在位置s上 
		v[s] = v[j] ;
		s = j;
	}
	v[s] = rc ; //插入
}
void HeapSort(vector<int> &v)
{ // 对vector进行堆排序
	int t , i;
	for( i=v.size()/2 ; i>0 ; i--) // 把v建成大顶堆
		HeapAdjust( v,i,v.size()-1 );
	for( i=v.size()-1 ; i>0 ; i-- )
	{//将堆顶记录和当前未经排序子序列[0..i]中最后一个记录相互交换
		t = v[0];
		v[0] = v[i];
		v[i] = t ;
		HeapAdjust(v,0,i-1); // 将v[0..i-1]重新调整为大顶堆 
	}
}
//堆排序测试函数
void heap_sort()
{
	vector<int> v( orited );
	double start ,end;
	start = clock();
	HeapSort(v);
	end = clock();
	cout << "heap   sort cost : " <<  end - start << endl;	
}
int main(int argc, char* argv[])
{
	randNum();    //每次更新MAX,重新生成随机数,存到vector
 	vector_sort();
 	quick_sort(); 
 	bubble_sort();
  	select_sort();
 	merge_sort(); 
 	shell_sort(); 
 	heap_sort();  
	insert_sort();
	return 0;
}

       关于sort(),这里 默认是按照升序排列的,如果想按照降序排列,可添加函数:

bool compare(int a ,int b)
{
	return a>b;//a>b降序 a<b升序
}
并调用时
	sort(v.begin(),v.end(),compare);
       即可。

       在程序的main部分给出了部分测试结果,其中shell的不具有太大参考性,于是没列(用书的原话说,shell排序的分析是一个复杂的问题,因为时间是所取增量序列的函数,这涉及一些数学上尚未解决的问题),将排序结果保存在文件中观看,可以看到,shell的结果,不像快速排序似的能完全正确,概率问题。

     vc6测试结果如下:

 

Sort()

Quick

Bubble

Select

Merge

Shell

heap

insert

1k

0

1

78

35

107

14

2

21

1w

2

12

4883

3099

7947

1135

34

2274

10w

26

142

410630

385299

774607

108289

267

220359



vs08下测试结果如下:(vs08 下,insert会有部分错误,所以未列出)

 

Sort()

Quick

Bubble

Select

Merge

Shell

heap

1k

26

2

193

291

15

90

8

1w

302

29

12674

8203

216

3010

57

10w

3624

378

1.02754e+006

804142

804142

804142

713


gcc下测试结果:

 

Sort()

Quick

Bubble

Select

Merge

Shell

heap

insert

1k

0

0

9

3

1

2

1

2

1w

2

3

725

452

81

170

4

294

10w

29

27

55812

34269

4390

16272

45

28208


       统计结果当然是明显的,除了在vs08中,sort()的确不是一般的快啊(尤其是vc6下,压倒性优势),紧跟其后的是quicksort和heapsort。对于heapsort,这里的堆,直接用顺序表示了,也算省了不少时间。


      神奇的是vc6下的merge居然比冒泡还慢,没天理嘛,当然还好gcc这样一个标准的c++测试给了我们信心。

      刚统计完发现插入没做,补充上统计结果, 目前就算是这样吧,有什么不对的,请跟帖说明修改啊。


     后记:后来改用了双向冒泡,发现比原冒泡快了一倍多,比选择还略快(后来测试,起初的写法出错了,其实和单向冒泡速度是一样的)

代码如下:

	for (i=0 ; i< MAX ; i++)
	{
		k = MAX-i-1;
		for (j=i+1 ; j< k ; j++)//改用双向冒泡
		{
			if (v[j] < v[i])
			{
				swap(&v[i],&v[j]);
			}
			if (v[MAX-j-1] > v[k])
			{
				swap(v[MAX-j-1],v[k]);
			}
		}
	}


运行时间结果马上更新

       本想把选择改为双向选择,min存低位,max存在高位,第二个循环j<MAX-i的,不过存在一些问题,比如可能交换2次的情况,在min循环交换后,又max交换,则不是预期的结果了,以后有心情再搞吧。

排序算法可视化:从冒泡到快排的原理与工程选型 排序算法是数据结构与算法学习中的核心内容,也是面试和工程实践的高频考点。理解不同排序算法的时间复杂度、空间复杂度和稳定性至关重要,但仅靠代码模板很难建立动态直觉。通过可视化演示,可以直观观察元素比较、交换与移动过程,深入理解冒泡排序、快速排序、归并排序等11种经典算法的工作原理。从O(n²)的冒泡、选择、插入排序,到O(n log n)的归并、快排、堆排序,再到计数排序、桶排序等非比较排序,每种算法都有其适用场景。实际工程中,应根据数据规模、有序性、内存限制和稳定性需求选择合适的排序策略,同时善用语言内置的 阅读详情

相关推荐

排序算法——希尔排序 Shell Sort(C++ Java)

希尔排序(ShellSort)也称递减增量排序算法,其实它是插入排序的优化版本。希尔排序是非稳定排序算法。 希尔排序对插入排序的以下两点进行改进: (1)插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; (2)一般来说插入排序是低效的,因为插入排序每次只能将数据移动一位。 原始的算法实现在最坏的情况下需要进行O(n^2)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(n(logn)^2)。这比最好的比较算法的O(nlogn)要差一些。 希..

愿君出走半生,归来时仍是少年 445

【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

arr[n-1]已经排好序,此时用arr[i]待排序的值与前面的数进行比较,找到插入的位置,将arr[i]插入,原来位置上的元素依次向后移动。把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。把堆顶数据和最后一个数据进行交换,把最后一个数不看做堆里面的,相当于n-1个数,向下调整,选出次大的数。每次从待排序的数列中选出最小(或最大)的一个元素,存放在数列的起始位置,直到全部待排序的元素排完。1、R停住,L遇到R,相遇的位置就是R停住的位置。

Hush_H的博客 6400

AIGC内容溯源技术:如何追踪AI生成内容的原始来源

本文旨在系统性地介绍AIGC内容溯源的技术体系,帮助读者理解如何追踪AI生成内容的来源。我们将覆盖从基础概念到前沿技术的完整知识链,包括但不限于数字水印、区块链存证、内容指纹等技术方案。文章将从AIGC的基本概念出发,逐步深入探讨各种溯源技术,分析其原理和实现,最后讨论实际应用和未来趋势。AIGC:AI Generated Content,人工智能生成内容内容溯源:追踪数字内容的创作、修改和传播历史数字水印:嵌入在数字内容中的不可见识别信息数字水印:隐藏在内容中的识别信息,像隐形墨水内容指纹。

SuperAGI2025 2070

七大排序算法 - 冒泡、简单选择、直接插入、希尔、堆、归并、快速

点击上方,选择“置顶公众号”优质文章,第一时间送达排序的相关概念排序的分类根据在排序过程中带排序的记录是否全部被放置在内存中,排序分为:内排序外排序1.内排序内排序是在排...

公众号:Java后端 782

从零到一:基于STM32F103C8T6与HAL库的磁悬浮电赛装置实战解析

本文详细解析了基于STM32F103C8T6微控制器与HAL库,从零构建磁悬浮装置的完整实战方案。文章深入剖析了硬件设计中的线圈布局与“反向串联”巧思,以节省PWM资源;并阐述了采用三闭环PID控制算法的软件实现,结合Keil开发环境与HAL库进行工程搭建与调试。该方案为电子设计竞赛(电赛)提供了高可行性的参考,是嵌入式软硬件综合实践的优秀范例。

weixin_29169505的博客 273

AI自主网络攻击技术深度解析:从LLM驱动到防御体系升级

网络安全领域正经历从自动化脚本到智能自主攻击的范式转变。其核心原理在于将大型语言模型(LLM)与自动化渗透测试框架深度融合,构建具备环境感知、决策规划和自适应能力的攻击系统。这种技术的核心价值在于实现了从预设步骤到目标驱动的质变,能自主完成信息收集、漏洞利用、横向移动等复杂攻击链。在应用场景上,它不仅能极大提升高级持续性威胁(APT)的攻击效率,也对渗透测试和红队演练技术提出了新的要求。面对此类由AI驱动的自主攻击,传统的基于签名的防御体系已显不足,必须转向以行为分析和零信任为核心的整体纵深防御。本次曝光的

weixin_34254464的博客 604

常见排序算法的实现与性能比较

原文地址在这里,这里是多个排序算法全部整理过来的。整理转载过来只是为了自己阅读方便。 http://blog.youkuaiyun.com/morewindows/article/details/7961256 首先回顾下各种排序的主要思路: 一.       冒泡排序 冒泡排序主要思路是: 通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复

1072

Unity游戏开发客户端Lua基础

Unity游戏开发客户端面经之 lua 篇

Sea3752的博客 1万+

经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)

经典的内排序算法有: 插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序 为了分析所有的排序情况,给出一个模板程序用于测试,通过改写mySort函数来实现不同的排序算法。测试环境为vc++6.0。可以通过改变SIZE的大小来减少或增长排序所需的时间。 #include #include #include //元素的数目 #define SI

haoshen's blog 6707

how2heap 深入学习(1)

how2heap glibc 2.23学习

CoLin的pwn小屋 3177

硬件单板类机考复习提纲

6、 功率晶体管低导通损耗时处于的状态(饱和状态、放大状态、截止状态)(放大器的采样频率特性)总结:元器件特性(电阻、电容、二极管、三极管、晶体、晶振、MOS、磁珠等)信号质量问题产生根因(单调性、边沿过缓、毛刺、回沟、抖动等)3、 几种电容容量范围大小(超级电容、钽电容、陶瓷电容、铝电容)66、背板连接器接触设计的接触顺序(先导向、再地针、最后信号针)28、逻辑电平接口的特性(CMOS、TTL、ECL、PECL)76、差分电平(lvpecl、RS-422/485、cml)

2303_79562407的博客 1万+

八种排序算法(直接插入、shell、冒泡、快速、简单插入、堆排、归并、基数)的基本思想与实现、分析(时间复杂度、稳定性)以及全部代码实现

1、直接插入排序 直接插入排序基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。 排序过程: 代码实现: public class InsertSort { public stat...

斗鹰的技术专栏 2165

逆向工程视角:MFI芯片通信协议在Linux环境下的行为分析

本文从逆向工程角度深入分析了MFI芯片在Linux环境下的通信协议行为,重点探讨了树莓派与MFI芯片通过I2C接口交互的技术细节。文章详细介绍了信号捕获、协议栈逆向、动态调试技巧以及安全机制分析,为开发者提供了在Linux驱动层面实现MFI认证的实用方法。

time3的博客 175

常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比 - coder_xia的专栏 - 博客频道 - youkuaiyun.com...

常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比 - coder_xia的专栏 - 博客频道 - youkuaiyun.com常用排序算法的c++实现(冒泡,选择,插入,堆,shell,快速,归并 )与sort()对比...

weixin_33826609的博客 191

《AI应用架构师智能特征工程实践的前沿趋势解读》

面对传统方法的局限性,智能特征工程(Intelligent Feature Engineering)应运而生。智能特征工程是指利用人工智能、机器学习和自动化技术,实现特征提取、构造、选择和优化过程的自动化、智能化和可扩展化的方法和技术体系。效率提升:将数据科学家从繁琐的人工特征工程中解放出来,大幅缩短特征开发周期。质量保障:通过系统化方法发现人类难以察觉的特征模式,提高特征质量和模型性能。可扩展性:能够处理大规模、高维度和多类型的数据,适应不同领域和场景。降低门槛。

大数据洞察的博客 1179

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

几大典型排序算法的c++代码实现及总结

用C++类模板写了个排序算法的类,里面包含了几大经典算法的实现,例如插入排序、希尔排序、堆排序、冒泡排序、快速排序等。经测试该类可以很好地实现功能,方便直接引用。 // 几大典型的排序算法介绍以及代码实现 #ifndef _SORT_H_ #define _SORT_H_ #include using namespace std; template class CSort{ publ

zmajun的专栏 1504

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[C++]各种排序算法合集(冒泡,选择,插入,shell,基数,快排,归并)

#pragma once #ifndef SORT_COLLECTIONS_H_ #define SORT_COLLECTIONS_H_ #include <assert.h> #include <algorithm> #include <stdlib.h> #include <time.h> //#include "ge...

weixin_30293079的博客 96

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

常见15种排序算法总结及C++代码实现

花了将近一个月时间,学习并整理了常见15种排序算法,并亲自用C++代码实现了一遍。 通过这次学习,我对于每种算法的具体细节、适用场景、复杂度分析,有了更深的理解,代码能力也有不少提高。 建议大家有时间的话,都能亲自手写一遍每种排序的代码,收获真的要比只理解概念大很多。

qq_27673853的博客 826

C++十大排序算法全解析:从冒泡到基数,原理、实现与实战指南

排序算法是计算机科学的核心基础,它通过重新排列数据元素,使其满足特定顺序,是数据处理和检索的基石。其原理主要分为比较类和非比较类,前者通过元素间的直接比较决定次序,后者则利用元素本身的属性(如整数值、位数)进行排序。掌握排序算法的技术价值在于,它是衡量程序员对数据结构和算法理解深度的标尺,直接影响程序的性能和资源效率。在应用场景上,从数据库索引、搜索引擎排名,到操作系统任务调度、大数据分析,高效的排序无处不在。本文聚焦于C++实现,深入剖析包括快速排序、归并排序、堆排序在内的十大经典算法,并特别针对面试中常

cucanqi9387的博客 451

十大排序算法C++实现与选型指南:从冒泡到基数排序全解析

排序算法是计算机科学中数据处理的基础核心,其本质是通过特定规则对数据集合进行重新排列。从原理上可分为比较排序与非比较排序两大类,前者通过元素间比较决定次序,理论下限为O(n log n),后者则利用数据本身的属性(如整数范围)实现线性时间复杂度。理解不同算法的复杂度、稳定性及空间开销,对于优化程序性能、应对海量数据处理及内存敏感场景具有重要技术价值。在实际应用中,如数据库索引构建、大数据分析及嵌入式系统开发,需根据数据规模、分布特征及硬件限制进行算法选型。本文以C++工程实践为例,深入解析包括快速排序、堆排

weixin_34290631的博客 418

九大排序算法原理并使用C++实现

1.插入排序 假设有N个待排序元素,下标从0到N - 1。从位置p = 1开始从前往后扫描直到N - 1,在第p趟时,我们将位置p上的元素向左移直至找到它前面的元素都比它小为止。时间复杂度为O(N^2)。 #ifndef INSERTION_SORT_H #define INSERTION_SORT_H #include <vector> #include <functional> using namespace std; template <typename Compar

qq_18431031的博客 369

【算法-排序】排序算法完整知识及典型题型

本文系统梳理了CSP-J竞赛中排序算法的核心知识点,主要内容包括: 必考排序算法详解:冒泡排序、选择排序、插入排序、快速排序、归并排序的代码实现、时间/空间复杂度及稳定性分析 扩展排序算法:计数排序、堆排序、希尔排序、基数排序、桶排序的原理和特点 关键对比表格:10种排序算法在时间复杂度、空间复杂度、稳定性等方面的横向对比 典型考题解析:包含排序过程模拟、算法识别、时间复杂度计算等常见题型 实战应用指南:根据数据特征选择最优排序算法的原则 重点记忆: "快归堆"时间复杂度为O(nlogn

万法若空 844

十大经典排序算法解析与面试应用指南

排序算法是计算机科学基础核心,涉及时间复杂度、空间复杂度等关键概念。从冒泡排序到快速排序,不同算法各有适用场景:小规模数据适合插入排序,大规模数据常用归并排序或快速排序。在技术面试中,排序算法常被用来考察候选人的基本功,如字节跳动等公司面试常涉及Top K问题等实际应用。掌握这些算法不仅能提升编程能力,更能优化数据库查询、大数据处理等工程实践。本文深入解析十大经典排序算法,包括Python实现代码和面试应用技巧。

weixin_30279315的博客 458

各类排序算法的c++实现

#ifndef SORT_H #define SORT_H #include #include using namespace std; // 1.直接插入排序 template void InsertSort(ElemType data[], int n); // 2.折半插入排序 template void BInsertSort(ElemType data[], int n); // 3

ACM,再见! 1047
上一篇: c++的多态和虚函数(一)
下一篇: 《算法导论》学习总结——第一部分
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值