其他分享
首页 > 其他分享> > 排序大杂烩

排序大杂烩

作者:互联网

七个排序

这里介绍七个排序

选择排序

选择排序应该是最简单的排序之一
简单来说,找到剩余区间内的最小值然后放在一个有序区间的末尾
(不用纠结剩余区间什么意思,模拟一遍后你就会知道

算法实现

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]\)

举个简单例子

其实模拟一遍就很容易懂

算法实现

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的数的下标
} 

复杂度

选择排序

选择排序应该是最简单的排序之一
简单来说,找到剩余区间内的最小值然后放在一个有序区间的末尾
(不用纠结剩余区间什么意思,模拟一遍后你就会知道

算法实现

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 
} 

还有很多排序算法没有讲到
如果有不清楚的地方可以发评论私信提问
讲的不行还望海涵

标签:int,个数,大杂烩,最小值,有序,区间,排序
来源: https://www.cnblogs.com/guiyou/p/15107797.html