这里介绍七个排序算法
选择排序应该是最简单的排序之一
简单来讲,找到剩余区间内的最小值而后放在一个有序区间的末尾
(不用纠结剩余区间什么意思,模拟一遍后你就会知道数组
for(int i=1;i<len;++i){ int maxi=i; for(int j=i+1;j<=len;++j)//剩余区间 if(s[j]<s[maxi]) maxi=j;//记录区间中最小值下标 swap(s[maxi],s[i]); }
插入排序是经过“插入”来排序函数
经过将一个数插入到一个有序区间的某个位置,从而保证插入后区间有序
设为插入的数为b(插入后区间长度+1
则b在区间知足的条件为 \(a[i]<b<a[i+1]\)spa
举个简单例子指针
其实模拟一遍就很容易懂code
for(int i=1;i<len;++i){ cin>>s; for(int j=i-1;j>=1 && a[j]>s;--j) a[j+1]=a[j];//从后往前找 a[j+1]=s;//此时j为第一个小于s的数的下标 }
选择排序应该是最简单的排序之一
简单来讲,找到剩余区间内的最小值而后放在一个有序区间的末尾
(不用纠结剩余区间什么意思,模拟一遍后你就会知道blog
for(int i=1;i<len;++i){ int maxi=i; for(int j=i+1;j<=len;++j)//剩余区间 if(s[j]<s[maxi]) maxi=j;//记录区间中最小值下标 swap(s[maxi],s[i]); }
冒泡排序思想很简单,实现也很简单排序
咱们知道数组下标是有序的,只要咱们在数组中,以这个数的为下标的位置的数标记一下就能够,从1开始找,找到有标记位置就将输出递归
bool t[maxn]; for(int i=1;i<=len;++i){ int num;cin>>num; t[num]=1; }
堆排序通常能够直接用优先队列实现(这里不展开讲,有兴趣同窗能够到去看其余blog队列
#include<queue>//须要用到这个头文件 priority_queue<>
快速排序实际上是用到了分治的思想
将一个区间分为两个区间,左区间小中间这个数,右区间大于中间这个数
逐次递归分解愈来愈小的区间,最后使整个区间有序
void sort(int l,int r){ int mid=s[(l+r)>>1];//位运算等价于(l+r)/2; int i=l,j=r; while(i<=j){//这几步就是使左右区间的数分别知足小于和大于mid while(s[i]<mid) ++i;//i必定不大于 (l+r)/2 while(s[j]>mid) --j;//j必定不小于 (l+r)/2 //思考下为何不大于等于 if(i<=j){ swap(s[i],s[j]); i++;j--; } } //此时区间划分为[l,j] 和[i,r] if(l<j) sort(l,j); if(i<r) sort(i,r); }
通常不手写由于stl有
#include<algorithm> bool cmp(int a,int b){//int 可根据数组类型改成double或其余(甚至能够是结构体 return a<b;//数组按从小到大排序 return a>b;//数组按从大到小排序 } sort(a+1,a+1+n,cmp)//a为数组,a+1为须要排序的数组的起始位置,a+1+n为末位置,cmp为自定义函数
这里主要讲二路归并(还有多路归并
二路归并一样也有分治的思想
将两个有序的区间,合为一个有序的区间,和前面讲过的同样,一个数即为一个有序区间,
int m[maxn];//原序列 int temp[maxn];//存有序区间 void marge_sort(int l,int r){ if(l==r) return ; int mid=(l+r)>>1; marge_sort(l,mid);//左区间 marge_sort(mid+1,r);//右区间 int i=l,j=mid+1,p=l;//i为左区间左端点,j为右区间左端点 p为合成区间的末端指针 while(i<=mid && j<=r){ if(m[i]<m[j]) temp[p++]=m[i++];//两个序列相比较,小的放 else temp[p++]=m[j++]; } while(i<=mid) temp[p++]=m[i++];//右区间已经放完,而左区间也是有序的则,直接放入有区间后 while(j<=r) temp[p++]=m[j++];//同理,直接放入 for(i=l;i<=r;++i) m[i]=temp[i];//把有序序列放置给m }
还有不少排序算法没有讲到 若是有不清楚的地方能够发评论私信提问 讲的不行还望海涵