内排序算法一览

文章目录

        • 1 插入排序
        • 2 希尔(shell)排序
        • 3 冒泡排序
        • 4 快速排序
        • 5 选择排序
        • 6 堆排序
        • 7 归并排序
        • 8 内排序代码一览
          • 运行结果
          • 常用排序算法时间复杂度和空间复杂度一览表

  • 排序:将一组杂乱无章的数据按一定的规律顺次排列起来,可以看作是线性表的一种操作。
  • 内排序:排序期间元素全部存放在内存中的排序。
  • 并非所有内部排序算法都基于比较操作,基数排序就不基于比较。
  1. 排序算法的好坏如何衡量?
  • 时间效率——排序速度(即排序所花费的全部比较次数)
  • 空间效率——占内存辅助空间的大小
  • 稳定性——若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
  • 算法是否具有稳定性并不能衡量一个算法的优劣,它主要是对算法性质进行描述,内部排序算法的性能取决于算法的时间复杂度和空间复杂度,时间复杂度一般是由比较和移动次数决定。
  1. “快速排序”是否真的比任何排序算法都快?

基本上是,因为每趟可以确定的数据元素是呈指数增加的。

1 插入排序

插入排序的基本思想是:

每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的。

在已形成的有序表中线性查找,并在适当位置插入,把原来位置上的元素向后顺移。
在这里插入图片描述

时间效率

因为在最坏情况下,所有元素的比较次数总和为(0+1+…+n-1)→O(n2)。
其他情况下也要考虑移动元素的次数。 故时间复杂度为O(n2)

空间效率

仅占用1个缓冲单元——O(1)

算法的稳定性

因为25*排序后仍然在25的后面——稳定

直接插入排序算法的实现

void InsertSort ( int arr[],int n ) { int i,j,temp;              //temp暂存待插关键字for ( i = 1;  i <=n; i++)  //依次将A[2]~A[n]插入到前面已排序的序列{ temp=arr[i]; j=i-1 ;               //从i-1往前扫描while(j>=0 && temp<arr[j]){ arr[j+1]= arr[j];   //向后挪位--j ;                }    arr[j+1]= temp;      //复制到插入元素                           } 
} 

直接插入排序适用于顺序存储和链式存储的线性表

2 希尔(shell)排序

基本思想:

先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

优点:

让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。

在这里插入图片描述

void ShellSort(ElementType A[], int N) { /* 希尔增量序列 */for (D = N / 2; D > 0; D /= 2) {    //D=1即直接插入排序/* 插入排序 */for (i = D; i < N; i++) {tmp = A[i];for(j = i; j >= D && A[j - D] > tmp; i -= D) {A[j] = A[j - D];}A[i] = tmp;}}
}

时间复杂度

1.原始数据如下共有16个数据:

1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 | 15 | 8 | 16 |

2.进行 8 间隔排序后(未发生变化):

1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 | 15 | 8 | 16 |

3.进行 4 间隔排序后(未发生变化):

1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 | 15 | 8 | 16 |

4.进行 2 间隔排序后(未发生变化):

1 | 9 | 2 | 10 | 3 | 11 | 4 | 12 | 5 | 13 | 6 | 14 | 7 | 15 | 8 | 16 |

5.进行 1 间隔排序后(1间隔排序也就是插入排序):

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |

最坏情况(与插入排序一样)

T=O(n2)T = O(n^2)T=O(n2)

结论:

那么来观察它的间隔数 8 4 2 1,发现其间隔增量元素并不互质,则小的增量根本不起作用

稳定性:

由于不是相邻元素的比较和交换,它是不稳定的

希尔排序仅适用于线性表为顺序存储的情况

3 冒泡排序

基本思路:

每趟不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换。

优点:

每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换发生,还可以提前结束排序。

前提:顺序存储结构
在这里插入图片描述

void BubleSort(int arr[]),int n)
{int i,j,flag;int temp;for(i=n-1;i>=1;--i){flag=0;   //表示本趟冒泡是否发生交换的标志for(int j=1;j<=i;j++)if(arr[j-1]>arr[j]){temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;flag=1;  //发生交换则置flag为1}if(flag==0)  //未发生交换,结束return;}
}

冒泡排序的算法分析:

  • 时间效率:O(n2) —因为要考虑最坏情况
  • 空间效率:O(1) —只在交换时用到一个缓冲单元
  • 稳 定 性: 稳定 —25和25*在排序前后的次序未改变
  • 冒泡排序的优点:每一趟整理元素时,不仅可以完全确定一个元素的位置(挤出一个泡到表尾),还可以对前面的元素作一些整理,所以比一般的排序要快。

4 快速排序

基本思想:

从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。

优点:

因为每趟可以确定不止一个元素的位置,而且呈指数增加,所以特别快!

前提:
顺序存储结构

在这里插入图片描述

void QuickSort(int A[],int low,int high)
{if(low<high){       //明确的递归终止条件 int pivotpos=Partition(A,low,high);   //划分 QuickSort(A,low,pivotpos-1);QuickSort(A,pivotpos+1,high);}
}int Partition(int A[],int low,int high)  //将待排序的数组划分两个子表的操作 
{int pivot=A[low];    //将当前表中的第一个元素设为比较值,对表进行划分 while(low<high){     //递归跳出的条件 while(low<high&&A[high]>=pivot)  --high;A[low]=A[high];   //将比比较值小的元素移动到左端 while(low<high&&A[low]<=pivot)++low;A[high]=A[low];      //将比比较值大的元素移动到右端}A[low]=pivot;         //比较元素存放在最终位置 return low;	         //返回存放比较值的最终位置 
}

快排算法分析:

  • 时间效率:O(nlog2n) —因为每趟确定的元素呈指数增加
  • 空间效率:O(log2n)—因为递归要用栈(存每层low,high和pivot)
  • 稳 定 性: 不 稳 定 —因为有跳跃式交换。

5 选择排序

选择排序的基本思想:

每经过一趟比较就找出一个最小值,与待排序列最前面的位置互换即可。
——首先,在n个记录中选择最小者放到r[1]位置;然后,从剩余的n-1个记录中选择最小者放到r[2]位置;…如此进行下去,直到全部有序为止。

在这里插入图片描述

优点:实现简单
缺点:每趟只能确定一个元素,表长为n时需要n-1趟
前提:顺序存储结构

void SelectionSort(ElementType A[], int N)
{for (i = 0; i < N; i++) {/* 从 A[i] 到 A[N - 1] 中找最小元素,并将其位置赋值给 MinPosition */MinPosition = ScanForMin(A, i, N - 1);/* 将未排序部分的最小元素换到有序部分的最后位置 */Swap(A[i], A[MinPosition]);}
}

6 堆排序

  1. 堆的定义:设有n个元素的序列 k1,k2,…,kn,当且仅当满足下述关系之一时,称之为堆。

解释:如果让满足以上条件的元素序列 (k1,k2,…,kn)顺次排成一棵完全二叉树,则此树的特点是:树中所有结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小)。

  1. 怎样建堆?
    步骤:从最后一个非终端结点开始往前逐步调整,让每个双亲大于(或小于)子女,直到根结点为止。

堆排序算法分析:

  • 时间效率: O(nlog2n)。因为整个排序过程中需要调用n-1次HeapAdjust( )算法,而算法本身耗时为log2n;
  • 空间效率:O(1)。仅在第二个for循环中交换记录时用到一个临时变量temp。
    稳定性: 不稳定。
  • 优点:对小文件效果不明显,但对大文件有效。

7 归并排序

归并排序算法的基本思想 :

(1) 初始无序序列看成n个有序子序列,每个子序列长度为1;
(2) 两两合并,得到└ n/2┘个长度为2或1的有序子序列;
(3) 重复步骤2直至得到一个长度为n的有序序列为止。

在这里插入图片描述

两个有序表合并成一个有序表
在这里插入图片描述

合并算法:

//将有序表A[low..mid]和A[mid+1,high] 归并为有序表B[low..high] void Merge(ElementType A[], ElementType B[], int low, int mid, int high){       i = low;   j=mid+1;  k=low;               while (i <=mid && j <=high)   {               if (A[i] < A[j])    B[k++] = A[i++];                    else    B[k++] = A[j++];                }               while (i <=mid)        B[k++] = A[i++];           while (j <= high)      B[k++] = A[j++];  }      

给定区间的归并算法 :

//将A[low…high]中的序列归并排序后放到B[low…high]中        
void MSort(ElementType A[], ElementType B[], int low, int  high){               if  (low==high)    B[low]=A[low];              else  {              mid=(low+high)/2;   //将当前序列一分为二,求出分裂点mid           Msort(A, S, low, mid);     //对子序列A[low..mid]递归归并排序结果放入S[low..mid]  Msort(A, S, mid+1,high);    //对子序列A[mid+1..high]递归归并排序,结果放入S[mid+1..high]               Merge(S, B, low, mid, high);               //将S[low..mid]和S[mid+1..high]归并到B[low..high]                 }   }

归并排序算法实现:

   void MergeSort(ElementType A[])   {   //对顺序表A做归并排序 Msort(A, C, 1, A.length); }      

归并排序算法分析:

  • 时间效率:O(nlog2n)
  • 空间效率:O(n)
  • 稳 定 性:稳定

8 内排序代码一览

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
typedef int keytype;
typedef struct {keytype key;/*关键字码*/
}RecType;int s[50][2];/*辅助栈s*/
void PrintArray(RecType R[],int n)
{int i;for(i=0;i<n;i++)printf("%6d",R[i].key);printf("\n");
}
void InsertSort(RecType R[],int n)/*用直接插入排序法对R[n]进行排序*/
{int i,j;RecType temp;for(i=0;i<=n-2;i++){temp=R[i+1];j=i;while (temp.key<=R[j].key  && j>-1){R[j+1]=R[j];j--;}R[j+1]=temp;}
}
void ShellInsert(RecType *r,int dk,int n)
{int i,j;keytype temp;for(i=dk; i<n; ++i )if(r[i].key <r[i-dk].key ) //将r[i]插入有序子表{temp=r[i].key;r[i].key=r[i-dk].key;for(j=i-2*dk;j>-1 && temp<r[j].key; j-=dk )r[j+dk].key=r[j].key; // 记录后移r[j+dk].key = temp; // 插入到正确位置}
}
void ShellSort(RecType *L,int dlta[],int t,int n)/*希尔排序*/
{
// 按增量序列 dlta[t-1] 对顺序表L作希尔排序int k;for(k=0;k<t;k++)ShellInsert(L,dlta[k],n); //一趟增量为 dlta[k] 的插入排序
} // ShellSort
void CreatArray(RecType R[],int n)
{int i;Sleep(1000);srand( (unsigned)time( NULL ) );for(i=0;i<n;i++)R[i].key=rand()%1000;
}
void BubbleSort(RecType R[],int n) /*冒泡排序*/
{int i,j,flag;keytype temp;for(i=0;i<n-1;i++){flag=0;for(j=0;j<n-i-1;j++){if(R[j].key>R[j+1].key){temp=R[j].key;R[j].key=R[j+1].key;R[j+1].key=temp;flag=1;}}if(flag==0)break;}
}
int Hoare(RecType r[],int l,int h)/*快速排序分区处理*/
{int i,j;RecType x;i=l;j=h;x=r[i];do{while(i<j && r[j].key>=x.key)j--;if(i<j){r[i]=r[j];i++;}while(i<j && r[i].key<=x.key)i++;if (i<j){r[j]=r[i];j--;}}while(i<j);r[i]=x;return(i);
} /*Hoare*/
void QuickSort1(RecType r[],int n) /*快速排序非递归*/
{int l=0,h=n-1,tag=1,top=0,i;do{while (l<h){i=Hoare(r,l,h);top++;s[top][0]=i+1;s[top][1]=h;h=i-1;}/*tag=0表示栈空*/if (top==0)tag=0;else{l=s[top][0];h=s[top][1];top--;}}while (tag==1); /*栈不空继续循环*/
} /*QuickSort1*/
void SelectSort(RecType R[],int n)/*直接选择排序*/
{int i,j,k; RecType temp;for(i=0;i<n-1;i++){k=i;/*设第i个记录关键字最小*/for(j=i+1;j<n;j++)/*查找关键字最小的记录*/if(R[j].key<R[k].key)k=j;/*记住最小记录的位置*/if (k!=i) /*当最小记录的位置不为i时进行交换*/{temp=R[k];R[k]=R[i];R[i]=temp;}}
}
void HeapAdjust(RecType R[],int l,int m)/*堆排序筛选*/
{/*l表示开始筛选的结点,m表示待排序的记录个数。*/int i,j;RecType temp;i=l;j=2*i+1;   /*计算R[i]的左孩子位置*/temp=R[i]; /*将R[i]保存在临时单元中*/while(j<=m-1){if(j<m-1 && R[j].key<R[j+1].key)j++; /*选择左右孩子中最大者,即右孩子*/if(temp.key<R[j].key)/*当前结点小于左右孩子的最小者*/{R[i]=R[j];i=j;j=2*i+1;}else  /*当前结点不小于左右孩子*/break;}R[i]=temp;
}
void HeapSort(RecType R[],int n)/*堆排序*/
{int j;RecType temp;for(j=n/2-1;j>=0;j--) /*构建初始堆*/HeapAdjust(R,j,n);/*调用筛选算法*/for(j=n;j>1;j--)   /*将堆顶记录与堆中最后一个记录交换*/{temp=R[0];R[0]=R[j-1];R[j-1]=temp;HeapAdjust(R,0,j-1);/*将R[0..j-1]调整为堆*/}
}
void Merge(RecType aa[],RecType bb[],int l,int m,int n)
{/*将两个有序子序列aa[1…m]和aa[m+1,…n]合并为一个有序序列bb[1…n]*/int i,j,k;k=l;i=l;j=m+1;/*将i,j,k分别指向aa[1…m]、aa[m+1,…n]、bb[1…n]首记录*/while (i<=m && j<=n)    /*将aa中记录由小到大放入bb中*/if(aa[i].key<=aa[j].key)bb[k++]=aa[i++];elsebb[k++]=aa[j++];while (j<=n)     /*将剩余的aa[j…n]复制到bb中*/bb[k++]=aa[j++];while (i<=m)     /*将剩余的aa[i…m]复制到bb中*/bb[k++]=aa[i++];
}
void MergeOne(RecType aa[],RecType bb[],int len,int n)
{/*从aa[1…n]]归并到bb[1…n],其中len是本趟归并中有序表的长度*/int i;for(i=0;i+2*len-1<=n;i=i+2*len)Merge(aa,bb,i,i+len-1,i+2*len-1);/*对两个长度为len的有序表合并*/if(i+len-1<n)  /*当剩下的元素个数大于一个子序列长度len时*/Merge(aa,bb,i,i+len-1,n);else           /*当剩下的元素个数小于或等于一个子序列长度len时*/Merge(aa,bb,i,n,n);  /*复制剩下的元素到bb中*/
}
void MergeSort(RecType aa[],RecType bb[],int n)//归并排序 
{int len=1;    /*len是排序序列表的长度 */while (len<n){MergeOne(aa,bb,len,n-1);MergeOne(bb,aa,2*len,n-1);len=4*len;}
}int main()
{int n,data[3]={4,2,1},cord;RecType *r,*bb;printf("Please input number:");scanf("%d",&n);r=(RecType *)malloc(sizeof(RecType)*n);bb=(RecType *)malloc(sizeof(RecType)*n);memset(bb,0,sizeof(RecType)*n);do{printf("\n 主菜单  \n");printf("1----插入排序\n");printf("2----希尔排序\n");printf("3----冒泡排序\n");printf("4----快速排序\n");printf("5----选择排序\n");printf("6----堆排序\n");printf("7----归并排序\n");printf("8----退出\n");scanf("%d",&cord);switch(cord){case 1:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);InsertSort(r,n);PrintArray(r,n);break;case 2:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);ShellSort(r,data,3,n);PrintArray(r,n);break;case 3:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);BubbleSort(r,n);PrintArray(r,n);break;case 4:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);QuickSort1(r,n);PrintArray(r,n);break;case 5:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);SelectSort(r,n);PrintArray(r,n);break;case 6:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);HeapSort(r,n);PrintArray(r,n);break;case 7:memset(r,0,sizeof(RecType)*n);CreatArray(r,n);PrintArray(r,n);MergeSort(r,bb,n);PrintArray(r,n);break;case 8:exit(0);default:cord=0;}}while(cord<=8);return 0;
}
运行结果

在这里插入图片描述

常用排序算法时间复杂度和空间复杂度一览表
排序法最差时间分析平均时间复杂度稳定度空间复杂度
冒泡排序O(n^2)O(n^2)稳定O(1)
快速排序O(n^2)O(n*log2n)不稳定O(log2n)~O(n)
选择排序O(n^2)O(n^2)稳定O(1)
2-路归并排序O(n*log2n)O(n*log2n)O(n)
插入排序O(n^2)O(n^2)稳定O(1)
堆排序O(n*log2n)O(n*log2n)不稳定O(1)
希尔排序OO不稳定O(1)

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

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

相关文章

Nature:神经元在大脑中的起点并不一定是它们的终点

来源&#xff1a;生物通虽然人体有30亿个DNA碱基和超过30万亿细胞&#xff0c;格里森和他的同事们发现只有几百DNA突变可能出现在头几个细胞分裂后的受精胚胎或在大脑的早期发展。通过在死者的大脑中跟踪这些突变&#xff0c;他们第一次能够重建人类大脑的发育。胎儿大脑的发育…

扎克伯格Meta元宇宙被质疑:年均烧百亿美元,货要等十年

来源&#xff1a;新智元公司内部业务混乱、公司外部观感酷似曾经的雅虎&#xff0c;这些与扎克伯格的元宇宙发力结合在一起&#xff0c;让Meta的新老员工都怨声载道。不少Meta的员工&#xff0c;现在都在抱怨老板的元宇宙项目顾头不顾腚、在公司内部徒增业务困扰但并无法带来收…

链栈的介绍与实现

文章目录1 链栈定义2 链栈基本操作3 链栈代码实现1 链栈定义 链栈&#xff1a;采用链式存储的栈称为链栈 在一个链栈中&#xff0c;栈底就是链表的最后一个结点&#xff0c;而栈顶总是链表的第一个结点。因此&#xff0c;新入栈的元素即为链表新的第一个结点&#xff0c;只要…

栈与递归

文章目录1 递归的概念2 递归算法3 递归数据结构4 递归实现5 递归与循环差别1 递归的概念 递归是指在定义自身的同时又出现了对自身的调用。如果一个函数在其定义体内直接调用自己&#xff0c;则称直接递归函数&#xff1b;如果一个函数经过一系列的中间调用语句&#xff0c;通过…

马斯克与推特达成收购协议 专家警告称这一步迈得过大

来源&#xff1a;网易智能4月26日消息&#xff0c;当地时间周一&#xff0c;在特斯拉首席执行官埃隆马斯克&#xff08;Elon Musk&#xff09;敲定将以440亿美元的价格收购个人社交媒体平台推特后&#xff0c;特斯拉股价盘中一度下跌超2%&#xff0c;最终收于每股998.02美元&am…

循环队列的介绍与实现

文章目录1 循环队列定义2 循环队列基本操作3 循环队列代码实现4 补充1 循环队列定义 循环队列&#xff1a;即顺序存储的队列&#xff0c;是为了避免“假溢出”而利用%运算符将队列首尾相接连成一个环状的队列&#xff0c;称为循环队列。 引入循环队列克服顺序队列中存在的“假…

5年内开炸第一颗小行星,改变其轨道!中国计划建立小行星预警监测系统

来源&#xff1a;大数据文摘不知道多少科幻片中&#xff0c;小行星成为了人类灭绝的罪魁祸首。在超高的速度加持下&#xff0c;直径只有十几公里的小行星撞击地球&#xff0c;都有可能造成人类毁灭。为了提前预警这样的事件发生&#xff0c;人类做出了不少努力。美国航天局NASA…

算术逻辑单元设计

文章目录1 基本逻辑符号1.1 ALU1.2 逻辑符号1.3 复合逻辑2 加法器设计2.1 一位加法器2.2 进位产生原理2.2 多位二进制位加法器1 基本逻辑符号 1.1 ALU ALU功能&#xff1a; 算术运算&#xff1a;加、减、乘、除等 逻辑运算&#xff1a;与、或、非、异或等 辅助功能&#xff1a…

数字孪生城市框架与全球实践洞察(2022)

来源 &#xff1a; 世界经济论坛编辑 &#xff1a;蒲蒲全球数字孪生市场蓬勃发展。据预测&#xff0c;到2030年&#xff0c;数字孪生技术的应用将为城市规划、建设、运营节省成本达到2800亿美元。市场规模方面&#xff0c;2020年全球数字孪生市场规模为31亿美元&#xff0c;预计…

2 计算机组成原理第二章 数据的表示和运算 定点数运算 浮点数运算

文章目录1 进制转换2 定点数表示及其运算2.1 定点数表示2.1.1 真值→补码2.1.2 补码→真值2.1.3 [XT]补 →[-XT]补2.1.4 真值、原码、反码、补码转换关系图形总结2.2.4 移码2.2 定点数运算2.2.1 移位运算2.2.2 定点数加减运算2.2.3 溢出判断判溢出方法一判溢出方法二判溢出方法…

Gartner:AI和自动化将是新一代SASE的关键能力

来源&#xff1a;安全内参近年来&#xff0c;安全访问服务边缘&#xff08;SASE&#xff09;技术快速发展&#xff0c;得到了较广泛的行业应用。SASE架构通常包括了SD-WAN、FWaaS、安全Web网关、云访问安全代理&#xff08;CASB&#xff09;和零信任网络访问&#xff08;ZTNA&a…

MIPS指令与MIPS汇编语言

文章目录1 MIPS简介2 MIPS指令系统的特点3 MIPS寄存器4 MIPS指令格式4.1 R-Type型指令4.2 l-Type型指令4.3 J-Type型指令4.4 三类指令小结5 MIPS例题6 MIPS过程调用6.1 过程调用和栈6.2 MIPS中栈的实现6.3 栈帧的概念6.4 MIPS中的过程调用&#xff08;假定P调用Q&#xff09;6.…

DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年

来源&#xff1a;OneFlow社区翻译&#xff1a;刘晓祯、沈佳丽、胡燕君、许晨阳、周亚坤很少有人会否认&#xff0c;过去十年&#xff0c;AI领域最耀眼的明星组织当属DeepMind&#xff0c;没有之一。那个震动世界的高光时刻发生在2016年3月的一天&#xff0c;AI选手AlphaGo击败了…

链队的介绍与实现

文章目录1 链队定义2 链队基本操作3 代码实现1 链队定义 队列的链式存储结构简称为链队列&#xff0c;它是限制仅在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作&#xff0c;为此再增加一个尾指针&#xff0c;指向链表上的最后一个结点。 type…

二叉树介绍与代码实现

文章目录1 树的基本概念1.1 树的形式定义1.2 树的递归定义1.3 树的基本术语1.4 二叉树的递归定义1.5 存储方法1.6 满二叉树VS完全二叉树2 二叉树的性质3 代码实现1 树的基本概念 1.1 树的形式定义 T{D&#xff0c;R} D为树T中包含n个结点的有限集合&#xff0c;R为树中结点之间…

2022先进计算七大趋势

来源&#xff1a;CBInsights 中文编辑&#xff1a;蒲蒲作为智能社会的底座、数字经济的引擎&#xff0c;算力的重要性已经被提到一个前所未有的高度。当下&#xff0c;算力的提升仍然面临着来自多个维度的挑战。不论是硬件层面还是架构层面&#xff0c;算力发展都亟需变革。先进…

类脑计算将何去何从?

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;编译&#xff1a;nature.摘要类脑计算新技术有望通过完全不同的方式处理信息&#xff0c;能效极高&#xff0c;并能处理我们加速产生的大量非结构化和嘈杂的数据。为了实现这一承诺&#xff…

1 计算机网络体系结构与OSI参考模型

文章目录1 计算机网络概述1.1 计算机网络概念1.2 计算机网络的分类2 OSI 七层参考模型应用层表示层会话层传输层网络层数据链路层物理层3 OSI参考模型与网络排错4 OSI参考模型与网络安全5 TCP/IP协议和OSI参考模型1 计算机网络概述 1.1 计算机网络概念 计算机网络概念&#xf…

一个故事讲完 CPU 的工作原理

来自&#xff1a;知乎 作者&#xff1a;柳两丛 www.zhihu.com/question/40571490/answer/718942643上二年级的小明正坐在教室里。现在是数学课&#xff0c;下午第一节&#xff0c;窗外的蝉鸣、缓缓旋转的吊扇让同学们昏昏欲睡。此时&#xff0c;刘老师在黑板上写下一个问题&a…

2 计算机网络性能指标

文章目录速率带宽吞吐量时延时延带宽积往返时间网络利用率速率 连接在计算机网络上的主机在数字信道上传送数据位数的速率&#xff0c;也称为data rate或bit rate。 单位是b/s, kb/s, Mb/s, Gb/s. 比特&#xff08;bit&#xff09;是计算机中数据量的单位&#xff0c;也是信息论…