排序算法的总结

本文深入讲解了多种排序算法,包括计数排序、选择排序、冒泡排序、插入排序、基数排序、归并排序、堆排序及快速排序等,探讨了它们的时间复杂度、稳定性以及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1计数排序

一开始学排序算法想必就是用的计数排序话不多说直接上代码

复杂度最低的排序算法,稳定排序,O(n+m),n为元素个数,m为数值范围。在范围小的时候可以采用

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#define M 1000005

using namespacestd;

int cnt[M];

int main(){

      int n,a;

      cin>>n;

      for(int i=1;i<=n;i++){

           cin>>a;

           cnt[a]++;

      }

      for(int i=0;i<=100004;i++){

           if(cnt[i]){

                 for(intj=1;j<=cnt[i];j++)cout<<i<<" ";

           }

      }

      return 0;

}

2

选择排序

也是最开始接触排序算法时学的代码如下

不稳定算法 复杂度O(n^2)

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#define M 1000005

using namespacestd;

int A[M];

int main(){

      int n;

      cin>>n;

      for(int i=1;i<=n;i++)cin>>A[i];

      for(int i=1;i<=n;i++){

           for(int j=i+1;j<=n;j++){

                 if(A[j]<A[i]){

                      int t=A[i];

                      A[i]=A[j];

                      A[j]=t;

                 }

           }

      }

      for(inti=1;i<=n;i++)cout<<A[i]<<" ";

      return 0;

}

3.冒泡排序

很有意思的排序具体见代码

稳定排序,复杂度O(n^2),最好情况下O(n),冒泡排序发生的交换次数等于逆序对数

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#define M 1000005

using namespacestd;

int A[M];

int main(){

      int n;

      cin>>n;

      for(int i=1;i<=n;i++)cin>>A[i];

      for(int i=1;i<=n;i++){//每一次操作都将最大的数送到最后的位置

           bool f=0;

           for(int j=1;j<=n-i;j++){

                 if(A[j]>A[j+1]){

                      int t=A[j];

                      A[j]=A[j+1];

                      A[j+1]=t;

                      f=1;

                 }

           }

           if(!f)break;//如果没有经过冒泡说明已经有序

      }

      for(inti=1;i<=n;i++)cout<<A[i]<<" ";

      return 0;

}

4.插入排序

很形象的一个排序 将一个数插入进去其他位置下标往后挪 是一个稳定的排序算法复杂度最坏O(n^2)最好O(n)

代码如下:

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#define M 1000005

using namespacestd;

int A[M];

int main(){

      int n;

      cin>>n;

      for(int i=1;i<=n;i++)cin>>A[i];

      for(int i=1;i<=n;i++){

           int x=A[i];

           int j;

           // //[1,i-1]已经有序,把x插入进去

           for(j=i-1;j>=1&&x<A[j];j--)

                A[j+1]=A[j];//比x大的数往后挪

           A[j+1]=x;//插入x

       }

      for(inti=1;i<=n;i++)cout<<A[i]<<" ";

      return 0;

}

5.基数排序

很好理解的一个排序算法 因为这是按照位来比较

假如有5个数

12 57 100 29 33

先比较个位排序 100 012 013 057 029

在比较十位排序 100 012 013 029 057

最后比较百位   012013 029 057 100

得出答案12 13 29 57 100 是不是很好理解

注意数值需要判负数可以加上一个很大的数 然后再比较大小

复杂度O(n*m)m为最高位的长度

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#define M 1000005

using namespacestd;

int A[M];

int s[10][M];

int main(){

      int n,i,j,k;

      scanf("%d",&n);

      for(i=0;i<n;i++)scanf("%d",&A[i]);

      int len[10],d=1;

      for(i=0;i<10;i++){

           for(j=0;j<10;j++)len[j]=0;

           for(j=0;j<n;j++){

                 k=A[j]/d%10;//第i位上的数值

                 s[k][len[k]++]=A[j];

           }

           int m=0;

           for(j=0;j<10;j++){//按第i位依次排序

                 for(k=0;k<len[j];k++)

                      A[m++]=s[j][k];

           }

           d*=10;//继续判断下一位

      }

      for(i=0;i<n;i++)printf("%d",A[i]);

      return 0;

}

6.归并排序 很重要的一种排序算法体现了一个很重要的思想 分治思想 分治即分而至

序列1 2 4 7 3 5 9 8

可以劈成两半 各自内部进行排序之后再合并起来

复杂度为稳定的O(nlogn)稳定排序

代码:

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

#define M 100005

using namespacestd;

int A[M],B[M];

void merge(intL,int R){//主函数调动merge(1,n)

      if(L==R)return;//如果只有一个数自然不用劈成两半

      int mid=(L+R)>>1;

      merge(L,mid);.//左边继续归并

      merge(mid+1,R);//右边继续

      int i=L,j=mid+1,k=L;

      while(i<=mid&&j<=R){

           if(A[i]<A[j])B[k++]=A[i++];

           else B[k++]=A[j++];

      }

      while(i<=mid)B[k++]=A[i++];

      while(j<=R)B[k++]=A[j++];

      for(int k1=L;k1<=R;k1++)A[k1]=B[k1];//将B数组重新合并赋值给A

}

int main(){

      int n;

      cin>>n;

      for(int i=1;i<=n;i++)cin>>A[i];

      merge(1,n);

      for(inti=1;i<=n;i++)cout<<A[i]<<" ";

      return 0;

}

7.堆排序

堆是一种完全二叉树 只要构造一个堆满足小顶堆(即父亲节点的值大于两个儿子节点的值) 每次取出堆顶部的数然后继续组成一个堆就可以完全排序

复杂度O(nlogn)不稳定

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

#define M 100005

using namespacestd;

int heap[M],n,sz;

void swap(int&a,int &b){

      int t=a;a=b;b=t;

}

void down(int x){

      int t;

      while(x<=sz){

           int k1=x*2,k2=x*2+1;

           if(heap[x]>heap[k1]&&k1<=sz){

                 t=k1;

           }else t=x;

           if(heap[t]>heap[k2]&&k2<=sz){

                 t=k2;

           }

           if(t!=x){

                 swap(heap[x],heap[t]);

                 x=t;

           }else break;

      }

}

void pop(){

      cout<<heap[1]<<"";//输出堆顶最小的

      heap[1]=heap[sz];//用堆最后的那个数覆盖第一个

      sz--;

      down(1);//down一下继续构造一个小顶堆

}

int main(){

      cin>>n;

      sz=n;

      for(inti=1;i<=n;i++)cin>>heap[i];

      for(int i=n/2;i>=1;i--)down(i);

      for(int i=1;i<=n;i++)pop();

      return 0;

}

8.关于希尔排序我也不是特别了解 就不作介绍了

快速排序也是一个极为重要的排序算法

以至于系统都有库函数 包含在头文件#include<algorithm>中

可以直接调用

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

#define M 100005

using namespacestd;

int A[M],n;

int main(){

      cin>>n;

      for(int i=1;i<=n;i++)cin>>A[i];

      sort(A+1,A+n+1);

      for(inti=1;i<=n;i++)cout<<A[i]<<" ";

      return 0;

}

好了 排完了是不是很快好吧我就是开个玩笑 然并卵 不了解使用原理 在noip2016初赛中 我惨烈的挂在快速排序上 平时都用sort调用原理都没弄懂 让我手敲sort直接懵逼了

快速排序的基本思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。然后再递归对这两部分进行排序。而这个数据的选择很有考究可以使用rand随机选取一个数据这样可以优化算法

不稳定的排序,平均复杂度是O(nlogn),最坏情况O(n^2)(有序数组)。

扩展用法:求序列中第K大数。

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<time.h>

#define M 100005

using namespacestd;

int s[M],n;

void sort(intL,int R){

      int low=L,high=R;

      int key=s[low];//当然可以用rand大法造key值 在此我选择第一个数

      while(low<high){

           while(low<high&&key<=s[high])high--;//滑动右边指针

           if(low<high)s[low]=s[high];

           while(low<high&&key>=s[low])low++;//滑动右边指针

           if(low<high)s[high]=s[low];

      }

      s[low]=key;//此时low与high相同

      if(L<low-1)sort(L,low-1);//递归排序左区间

      if(low+1<R)sort(low+1,R);//递归排序右区间

}

 

int main(){

      cin>>n;

      for(int i=1;i<=n;i++)cin>>s[i];

      sort(1,n);

      for(inti=1;i<=n;i++)cout<<s[i]<<" ";

      return 0;

}

     

 

内容概要:本文深入解析了扣子COZE AI编程及其详细应用代码案例,旨在帮助读者理解新一代低门槛智能体开发范式。文章从五个维度展开:关键概念、核心技巧、典型应用场景、详细代码案例分析以及未来发展趋势。首先介绍了扣子COZE的核心概念,如Bot、Workflow、Plugin、Memory和Knowledge。接着分享了意图识别、函数调用链、动态Prompt、渐进式发布及监控可观测等核心技巧。然后列举了企业内部智能客服、电商导购助手、教育领域AI助教和金融行业合规质检等应用场景。最后,通过构建“会议纪要智能助手”的详细代码案例,展示了从需求描述、技术方案、Workflow节点拆解到调试与上线的全过程,并展望了多智能体协作、本地私有部署、Agent2Agent协议、边缘计算插件和实时RAG等未来发展方向。; 适合人群:对AI编程感兴趣的开发者,尤其是希望快速落地AI产品的技术人员。; 使用场景及目标:①学习如何使用扣子COZE构建生产级智能体;②掌握智能体实例、自动化流程、扩展能力和知识库的使用方法;③通过实际案例理解如何实现会议纪要智能助手的功能,包括触发器设置、下载节点、LLM节点Prompt设计、Code节点处理和邮件节点配置。; 阅读建议:本文不仅提供了理论知识,还包含了详细的代码案例,建议读者结合实际业务需求进行实践,逐步掌握扣子COZE的各项功能,并关注其未来的发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值