几种排序算法比较

2023-10-26

  • 前言

排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作,是对无规律的一组序列转化为递增或递减的操作。

排序的稳定性:

       当排序记录中的关键字都部相同时,则任何一个记录的无序序列经过排序后得到的结果都唯一,反之,若存在两个或多个关键字相同时,则得到的结果可能不唯一。

       假设Ki=Kj且排序前Ki在Kj之前,排序后Ki仍然在kj之前,则称排序时稳定的,反之,若可能使排序后Ki在Kj之后,则称排序是不稳定的。注意,只要有一组关键字的实例不满足稳定的要求,则该排序算法就是不稳定的。各有各的适用场合。

内部排序和外部排序:

       由于待排序记录的数量不同,使得排序过程中数据所占用的存储设备会有所不同。根据在排序过程中记录所占用的存储设备,可将排序分为两大类:内部排序和外部排序。

       内部排序是的是待排序记录全部存放在内存中进行排序的过程,外部排序指的是由于待排序记录的数量很大,以至内存不能一次全部容纳,在排序过程中仍需对外存进行访问的过程。


  • 冒泡排序

基本思想:

       两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。之所以叫做冒泡排序,是因为每次将一个最大或最小的数往后沉淀,沉淀到后面的数比它大或比它小为止,类似于泡泡向上浮起来的过程。

 冒泡排序是排序方法中最直观也是最简单的,我们接触的第一种排序方法也是冒泡排序,基本步骤:

  有一个数组a[10],用变量i表示它的下标(i从0开始)
(1) 比较两个相邻元素a[i]和a[i+1],如果a[i]>a[i+1],就交换这两个数的位置;
(2)重复执行第一步,直到比较到最后一对的时候(例:首次是a[8]和a[9],此时,a[9]的值为该数组的最大值,这个值属于有序数列);
(3)对所有元素(除了有序数列里的元素),重复执行第一步和第二步,每执行完一次,都会找到当前比较的数里最大的那个(有序数列就会增加一个);
(4)随着参与比较的元素越来越少,最终没有任何一对元素需要比较的时候,排序完成。

void BubbleSort(int a[],int n)
{
	for(int i=0;i<n;i++)
	for(int j=0;j<n-i-1;j++)
	if(a[j]>a[j+1]) //两两比较 
	swap(a[j],a[j+1]);
}

时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:由于交换的if条件是a[j]>a[j+1],所以如果等于的话并没有交换,所以冒泡排序是一种稳定排序算法。

冒泡排序较稳定,可用于链式存储结构,时间复杂度较高,当n较大,初始记录无序时,不宜采用此方法


  • 选择排序

通过n-1次关键字比较,从n-i+1个记录中选择关键字最小的记录,并和第i个记录交换。

选择排序是经过一次一次在无序区间中找到最值,放到无序区间的前一个位置,基本步骤:

(1)设待排序的记录存放在数组r[n]中,第一趟从r[1]开始,通过n-1次比较,从n个记录中选取最小的记录,记为r[k],交换r[1]和r[k]

(2)第二趟从r[2]开始,通过n-2次比较,从n-1个记录中选出关键字最小的记录,记为r[k],交换r[2]和r[k]

(3)以此类推,第i趟从r[i]开始,通过n-i次比较,从n-i+1个记录中选取最小关键字记录,记为r[k],交换 r[i]和r[k]

(4)经过n-1趟,排序完成

void SelectSort(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		int k=i;
		for(int j=i+1;j<n;j++) //寻找最小元素的下标 
		if(a[j]<a[k])
		k=j;
		
		if(k!=i)  //放在已排序好的区间后面 
		swap(a[i],a[k]);
	}
}

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:就算法本身来说,是一种稳定排序

选择排序可用于链式存储结构,移动记录次序较少,当每一记录占用空间较多时,此方法比插入排序快


  • 插入排序

插入排序(直接插入排序)是一种最简单的排序方法,其基本操作是将一条记录插入到已排号的序列当中,从而得到一个有序的记录。

算法步骤:

(1)设待排序数组a[n],默认a[0]是一个有序序列

(2)循环n-1次,每次将为排序序列插入到前面的已排序序列当中,将已排序序列区间长度加1,未排序区间长度减一

(3)重复(2)直到未排序区间长度为0

void InsertSort(int a[],int n)
{
	for(int i=1;i<n;i++)
	{
		int end=a[i]; //记录未排序序列的第一个元素 
		int j=i-1;
		while(j>=0&&a[j]>end) //寻找位置 
		{
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=end; //插入 
	}
}

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定排序

算法简单稳定,容易实现,也适用于链式存储结构,在单链表中只需修改指针,更适用于初始记录基本有序的情况。对与查找插入位置,我们可以用二分查找获取位置。


  • 希尔排序

       希尔排序实质上是采用分组插入的方法,先将整个待排序记录序列分成几组,从而减少参与直接插入排序的数据量,对每组分别进行直接插入排序,然后增加每组的数据量,重新分组,这样经过几次分组后,整个序列基本有序,在对全体进行插入排序,希尔排序记录的分组,不是简单的逐段分组,而是将相隔某个记录增量的记录分成一组。

希尔排序的基本步骤:

(1)第一趟取增量gap(gap<n)把全部几记录分成gap个组,对每组进行直接插入排序

(2)第二趟取gap=gap/2,重复第一步

(3)以此类推,直到gap=1,再对整个序列排序一次

​
void ShellSort(int a[],int n)
{
    for(int gap=n/2;gap>0;gap/=2)
    for(int i=gap;i<n;i+=gap)
    {
    	int end=a[i];
    	int j=i-gap;
    	while(j>=0&&a[j]>end)
    	{
    		a[j+gap]=a[j];
    		j-=gap;
        }
	a[j+gap]=end;
   }
}

​

注意这里的gap不是区间长度,而是区间的跨度,例如数组a[10],此时gap=n/2=5;每个区间的跨度为5,每次gap取上一次的一半,第一次就分为了5组分别为[0,4]、[1,5] 、[2,6]、 [3,7] 、[4,8]、 [5,9];注意是左闭右闭区间。希尔排序做到了跳跃式移动,从而使最后一次gap=1时,序列已基本有序,因此较直接插入排序时间复杂度低。

时间复杂度:时间复杂度比较复杂,通常认为O(n*log 2  n),当n趋近于无穷大时,可以为O(n(log2 n)^2)

空间复杂度:O(1)

稳定性:不稳定

        希尔排序只能用于顺序存储结构,不能用于链式存储结构,增量gap可以有各种取法,但最后一次gap必须等于1, 总比较次数和移动次数较直接插入排序少,当n越大,序列越无序时,效果越明显。


  • 堆排序

        堆排序是一种树性选择排序,再排序过程中,将排序序列a[n]看成一个完全二叉树,利用二叉树双亲节点与孩子节点的内在联系,在当前无序的序列中,选择的关键字最大(或最小)的记录。

        堆的定义为 a[i]>=a[2*i]&&a[i]>=a[2*i+1]  或  a[i]<=a[2*i]&&a[i]<=a[2*i+1],通俗的理解就是在完全二叉树中,一个节点必须同时大于它的左节点和右节点。前者为大根堆后者为小根堆。

堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键字最大(或最小)的记录变得简单,步骤为:

(1)按照堆的定义将待排序序列a[n] 调整为大根堆,这个过程称为初建堆,交换a[1]和a[n] ,则a[n]为关键字的最大记录

(2)将a[n-1]重新调整为堆,交换ra[1]和a[n-1],此时a[n-1]为关键字最大记录

(3)循环n-1次,直到交换a[1]和a[2]为止

所以实现堆排序需要熟悉两个问题:建初堆、调整堆

调整堆就是比较此节点与它的左右孩子节点,选孩子节点中取最大或者最小的一个,与此节点比较,如果不满足条件就交换,直到进行到叶子节点为止。而要将一个无序序列调整为堆,就必须将其所在的二叉树中以一个节点为根的子树都调整为堆。

int a[10] = {1,3,2,4,8,9,7,5,6,0};

void adjust(int root, int n)
{
	int node = root * 2 + 1; //左子节点

	while(node < n)
	{
		//如果右节点比左节点大,node指向右节点
		if(node + 1 < n && a[node] < a[node+1])
			node++;

		if(a[node] < a[root])
			break;

		swap(a[node], a[root]);

		root = node;
		//向下
		node = node * 2 + 1;
	}
}

void heapSort(int n)
{
	//从最后一个非叶子节点往上调整
	for(int i = n/2; i >= 0; i--)
		adjust(i, n);

	for(int i = n-1; i > 0; i--)
	{
		//把根节点放到后面
		swap(a[0], a[i]);
		adjust(0, i);
	}
}

时间复杂度:O(nlog2 n)

空间复杂度:O(1)

稳定性:不稳定

       堆排序只能用于顺序存储结构,初始建堆比较次数较多,记录较少时不宜采用,在最坏情况下较快速排序而言是一个有点,记录较多时较为高效。


  • 归并排序

        归并排序类似与二分查找,都是二分当前区间,分别进行操作,可通过递归与送代进行实现,书面上定义是将两个或两个以上的有序表合成一个有序表的过程,将两个有序表合成一个有序表的过程称为2-路归并,2-路归并最为简单常用。

归并排序的算法思想:

       假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并。。。如此重复,直到得到一个长度为n的有序序列为止。

2-路归并排序将r[n]中的记录放到t[n]中,当序列长度等于1时,递归结束,否则:

(1)将当前序列一分为二,求出分裂点mid=(l+r)/2

(2)对子序列r[l]-r[mid]递归,进行归并排序,结果放在t[l,mid]中

(3)对子序列r[mid+1,r]递归,进行归并排序,结果放在t[mid+1,r]

(4)将两个有序的子序列t[l,mid],t[mid+1,r]归并为一个有序的序列放入r[l,r]中

void Merge(int a[], int left, int center, int right, int n) 
{
	int *t = new int[n];//存放被排序的元素
	int i = left;
	int j = center + 1;
	int k = 0;
	while (i<=center && j<=right)
		if (a[i] <= a[j])     t[k++] = a[i++];
		else                  t[k++] = a[j++];

	if (i == center+1)
		while (j <= right) t[k++] = a[j++];
	else
		while (i <= center) t[k++] = a[i++];

	//把t[]的元素复制回a[]中left到right段
	for (i=left,k=0; i<=right; i++,k++)
		a[i] = t[k];
	//释放内存
	delete []t;
}
void MergeSort(int a[], int left, int right) 
{
	if (left < right) 
	{
		int center = (left + right) / 2;//取得中点
		MSort(a, left, center);
		MSort(a, center+1, right);
		Merge(a, left, center, right, right-left+1);
	}
}

时间复杂度:O(nlog2n)

空间复杂度:O(n)

稳定性:稳定排序

归并排序可用于链式结构,且不需要附加存储空间,但递归实现任需要开辟相应的递归工作栈。


  • 快速排序

      快速排序在算法竞赛中用到的比较多,快速排序比冒泡排序要快很多,C语言中也有快速排序的函数qsort(),不过最好去理解一下底层代码实现。在冒泡排序过程中,只对两个相邻的记录进行比较,因此每次比较只能消除一个逆序,如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度,快速排序就是利用这个原理。

基本步骤:

(1)选择待排序记录中第一个记录作为基准,将基准暂存在r[0]的位置上,假设两个指针low和high,初始分别指向表的下界和上界

(2)从表的最右侧位置向左寻找第一个比基准数小的位置,从表的最左侧寻找第一个比基准数大的位置,交换两个元素

(3)重复(2)当low==high时,将基准数放到low位置处的元素判断大于还是小于后,与基准数交换

(4)此时以基准数的位置为分界点,将序列分为两个子序列,分别进行(1),(2),(3)操作,直到序列的长度为1为止

void QuickSort(int a[], int low ,int high) 
{
	if(low<high) 
	{ //判断是否满足排序条件,递归的终止条件
		int i = low, j = high;   
		int x = a[low];    
		while(i<j) 
		{
			while(i<j && a[j] >= x) j--;  
			
			if(i<j) a[i++] = a[j];   
			
			while(i<j && a[i] <= x) i++; 
			
			if(i<j) a[j--] = a[i];
		}
		a[i] = x;   
		QuickSort(a, low ,i-1); 
		QuickSort(a, i+1 ,high);
	}
}


//---------------------------------
//非递归版
#include<bits/stdc++.h>
using namespace std;

int a[1000];

int quick(int i, int j)
{
	int x = a[i];
	
	while(i < j)
	{
		while(i < j && a[j] >= x) j--;
		if(i < j)
			a[i++] = a[j];
		
		while(i < j && a[i] <= x) i++;
		if(i < j)
			a[j--] = a[i];
	}
	
	a[i] = x;
	
	return i;
}

void quicksort(int len)
{
	stack<int> s;
	
	int i = 0, j = len - 1;
	
	s.push(i);
	s.push(j);
	
	while(!s.empty())
	{cout << 'd' << endl;
		j = s.top(), s.pop();
		i = s.top(), s.pop();
		
		int mid = quick(i, j);
		
		if(i < mid - 1)
			s.push(i), s.push(mid - 1);
		
		if(j > mid + 1)
			s.push(mid + 1), s.push(j);
			
			
	}
}

int main()
{
	int n;
	cin >> n;
	for(int i = 0; i < n; i++)
	cin >> a[i];
	
	quicksort(n);
	
	for(int i = 0; i < n; i++)
	cout << a[i] << ' ';
	
	return 0;
}



/*
6
5 2 3 4 1 0
*/













时间复杂度:O(nlogn)

空间复杂度:O(log2n)—O(n)

稳定性:不稳定

快速排序过程中需要地位表的上界和下界,所以适合顺序结构,很难用于链式结构,当n非常大时,快速排序是所有排序过程中最快的一种,所以适合用于初始记录无序、n较大时的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种排序算法比较 的相关文章

  • C#中结构体排序方法(Array.sort() + ICompare)

    感觉C 比C 麻烦许多 资料也少 找了半天竟然没有找到一个能用的结构体排序 这是待排序的结构体 public struct la public int id public int sb 首先 C 需要调用一个空间 类似头文件 using S
  • JAVA中sort()函数的使用方法的个人总结

    1 sort 函数的基本格式 默认排序为升序排序 Arrays sort int a int fromIndex int toIndex Arrays sort 数组名 起始下标 终止下标 一个简单的排序例子 import java uti
  • uva 120(排序,检索)

    题目 Stacks and Queues are often considered the bread and butter of data structures and find use in architecture parsing o
  • Python List 按照多个关键字排序

    最近刷刷题遇到的 发现还没有一模一样的答案 自己做个解答 以列表有两列为例 我们需要按照两列排序 可以利用sorted和lambda组合 l a 2 c 1 d 4 b 2 sorted l key lambda x x 1 x 0 rev
  • 几种排序算法比较

    前言 排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作 是对无规律的一组序列转化为递增或递减的操作 排序的稳定性 当排序记录中的关键字都部相同时 则任何一个记录的无序序列经过排序后得到的结果都唯一 反之 若存在两个或多个关键
  • 排序

    桶排序 快 简单 但是浪费空间 memset num 0 sizeof num for int i 1 i lt n i scanf d t num t for int i 1000 i gt 1 i for int j 1 j lt a
  • 八大经典排序算法

    目录 插入排序 希尔排序 选择排序 堆排序 快速排序 hoare法 挖坑法 前后指针法 快速排序的优化 非递归实现快排 归并排序 计数排序 常见的八种排序算法 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序 插入排序 思
  • 收藏清单--排序

    LeetCode 收藏清单 给你一个数组 favoriteCompanies 其中 favoriteCompanies i 是第 i 名用户收藏的公司清单 下标从 0 开始 请找出不是其他任何人收藏的公司清单的子集的收藏清单 并返回该清单下
  • 【TreeMap】-根据 key 或 value 排序

    1 根据 key 排序 引言 TreeMap 中key 可以自动对 String 类型或8大基本类型的包装类型进行排序 但是 TreeMap 无法直接对自定义类型进行排序 当我们想对对 TreeMap 中 key 中的自定义类型排序时 必须
  • MySQL之快速入门

    安装MySQL 下载地址 http dev mysql com downloads windows installer 安装教程 http blog sina com cn s blog 7cecec9501017cmk html 安装完之
  • elasticsearch地理位置总结

    参考 https blog csdn net tang jian dong article details 104446526 https blog csdn net u013041642 article details 94416631
  • 集合泛型为对象,根据对象的某个属性进行排序

    根据集合里的深度 排序集合 Collections sort irFldsltpvMList new Comparator 为集合名 为实体类对象 Override public int compare IrFldsltpvM o1 IrF
  • 算法训练 星际交流

    ALGO 28 星际交流 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 人类终于登上了火星的土地并且见到了神秘的火星人 人类和火星人都无法理解对方的语言 但是我们的科学家发明了一种用数字交流的方法 这种交流方法是这样 的
  • STL算法之排序

    stl 算法库中提供的排序相关算法主要有以下几种 除了 q sort 定义在 cstdlib 头文件中 其余都定义在 algorithm 头文件 算法 功能 sort 排序 stable sort 稳定排序 保证等值情况时的原有顺序 par
  • 真正帮你实现—MapReduce统计WordCount词频,并将统计结果按出现次数降序排列

    项目整体介绍 对类似WordCount案例的词频统计 并将统计结果按出现次数降序排列 网上有很多帖子 均用的相似方案 重写某某方法然后 运行起来可能会报这样那样的错误 这里实现了一种解决方案 分享出来供大家参考 编写两个MapReduce程
  • 王道快速排序和归并排序的完整代码

    这是快排的代码要作为模板背下来 include
  • 冒泡排序--数组的简单排序,从大到小,从小到大

    冒泡排序 是计算机程序中较为常见和简单的排序算法 它需要重复地走访需要进行排序的元素列 按照一定顺序依次比较两个相邻的元素 如果顺序错误就把他们交换过来 示意原图如下 我们需要的结果示意图如下 那我们应该怎么进行程序的编写才能满足这样的结果
  • 数组(六)-- LC[1851] 包含每个查询的最小区间

    1 包含每个查询的最小区间 1 1 题目描述 给你一个二维整数数组 intervals 其中 i n t e r v a l
  • 泛型是实体类的集合,根据某一字段排序

    举例 List
  • mysql按照某个字段值内容排序

    举个栗子 假如一个商品下 有多个货品 各个货品的状态值都不一样 那么当只想展示商品中的某一个货品时 希望用户端看到的优先级是在售的货品中的一个 根据mysql提供的方法 field column value1 value2 value3 可

随机推荐

  • bat打包成exe

    在之前的文章中向大家介绍了如何通过exe 4j将jar打包成exe文件 这篇文章为大家介绍一下如何将 bat文件打包成exe文件 首先为大家介绍一下 下面我们使用的打包工具 下载地址 BAT to EXE Converter 积分多的小伙伴
  • Linux 抓包工具 tcpdump

    查看当前版本 tcpdump help 抓取指定端口包 tcpdump i eth0 c 10 udp or tcp port 1111 XX vvv 命令说明 c 10 抓10个包 udp or tcp 协议方式 可使用 tcp 或 ud
  • 自动化运维工具-Ansible(3)-模块介绍

    目录 Ansible命令格式 Ansible常用模块 Ansible模块如何搜索 Ansible模块保存位置 一 Ansible命令格式 Ansible 比喻为工人 Servers 目标机器 单个机器或者机器组 Module names 根
  • GoT:用大语言模型解决复杂的问题

    GoT 用大语言模型解决复杂的问题 摘要 介绍 背景和符号表示 语言模型和上下文学习 Input Output IO Chain of thought CoT Multiple CoT Tree of thoughts ToT GoT框架
  • 西门子S7-200 SMART 入门级项目案例详解

    这里写自定义目录标题 一 起保停控制 二 单按钮控制 三 正反转控制 四 混合控制 五 顺序控制 一 起保停控制 二 单按钮控制 三 正反转控制 四 混合控制 五 顺序控制
  • AIGC:从入门到精通

    AI生成内容 AIGC 人工智能生成内容 是一种新型的内容创作方式 它继承了专业生产内容 PGC Professional generated Content 和用户生成内容 UGC User generated Content 的优点 并
  • SVN+Gitee配置版本控制库

    软件 TortoiseSVN Downloads TortoiseSVN Gitee https gitee com 操作步骤 在Gitee中新建仓库 设置仓库名以及模板 Readme文件 启用SVN访问 在仓库的管理页面 选择 功能设置
  • 分库分表入门

    垂直分表 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表 每张表仅存储其中一部分字段 垂直分表拆解了原有的表结构 拆分的表之间一般是一对一的关系 优势 充分提高了热点数据的操作效率 商品信息的操作的高效率不会被商品描述的低效率所拖
  • 【第04例】IPD进阶

    目录 前言 专栏目录 内容详解 IPD 相关专栏推荐 华为流程体系 CSDN学院相关内容
  • pytorch使用masked掩盖某些值(筛选值)

    mask主要用来根据一定条件 筛选出一部分值来 基本案例 import torch x torch randn 3 4 mask 1 x ge 0 5 大于0 5的为True 小于0 5的值为False mask 2 torch BoolT
  • Deeplabcut教程(二)使用

    因为很久没用这个了所以就一直没更使用教程 写的安装教程收到好几条私信要使用教程 这几天在帮一个朋友跑这个 于是就有了这个使用教程 安装教程 Deeplabcut教程 一 安装 GPU CPU版本 纯新人向 CSDN博客 Step 1 启动
  • ubuntu交叉编译工具arm-linux-gcc安装

    1 安装交叉编译工具 arm linux gcc 安装包4 4 6 TQ210 release 20120720 tar bz2 环境 ubuntu 20 版 已换清华源 1 1解压文件 提取解压1 1 6到home目录 1 2配置环境 打
  • Unkonw column ‘xxx‘ in ’field list‘错误

    Unkonw column xxx in field list 错误 当使用jpa进行数据库操作时 数据库中的数据为 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 6I9QHwpX 1680000912061
  • Anaconda/jupyter notebook修改虚拟环境名称

    1 找到用户文件夹下的txt文件 比如C Users your username conda environments txt windows平台 找到当前主用户文件夹 有一个 conda文件夹 里面有一个environments txt文
  • 我的2012移动开发年度总结——革命的一年

    2012年 是我在移动行业畅游的一年 这一年发生了很多事 人生三大事之一结婚 评选csdn专家荣誉称号 坚持写博客写了一年 对手机这个行业总算有了个大体的认识 但是还有一些不顺人意的事 这里就不说了 但有一件事不得不说 在这家公司上班以来
  • QWidget尺寸限定

    1 控件只能在最小和最大之间进行调整 不能超过范围 直接宽高同时设置 window setMinimumSize 200 200 window setMaximumSize 500 500 app QApplication sys argv
  • unity3D游戏开发十之粒子系统

    Shuriken粒子系统是Unity3 5版本新推出的粒子系统 它采用模块化管理 个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种缤纷复杂的粒子效果 依次打开菜单栏中的GameObject gt Greate Other gt Pa
  • win10 python如何安装requests———超详细教程

    第一步 先检查你的python安装路径下的Scripts文件里有没有东西 我一开始查看时发现竟然是空白的 去搜寻了答案 python安装文件中 Scripts文件夹中没有文件目录 空白 注 我只是操作了该教程中的第二步 在cmd中输入pyt
  • 区块链的核心:共识机制

    我在上一篇 区块链到底是怎么运行的 一文中 提到了 打包交易 和 广播交易 这两个概念 其实 以上谈到的两个内容正是区块链最核心的技术内容之一 共识机制 在今天的文章中 我们就展开聊一聊区块链共识机制到底是什么 以及区块链的共识过程到底是怎
  • 几种排序算法比较

    前言 排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作 是对无规律的一组序列转化为递增或递减的操作 排序的稳定性 当排序记录中的关键字都部相同时 则任何一个记录的无序序列经过排序后得到的结果都唯一 反之 若存在两个或多个关键