排序(快速排序,归并排序)

快速排序

快速排序的过程:

Step #1:
4 2 4 5 1
mid=a[(l+r)>>1]=4

Step #2:
然后将按4把序列分为两部分,即:
1 2 | 4 5 4

然后重复上两个过程。

归并排序

使每次将两序列合并时,两个序列都有序。

4 2 4 5 1
每次对半拆,拆成1个数字
4 2 4 5 1
4 2 4|5 1
4|2 4|5 1
4|2|4|5|1
4|2 4|1 5
2 4 4|1 5
1 2 4 4 5


代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<iomanip>

using namespace std;
int n,a[100010];
int c[100010],tot;
long long read(){
	long long x=0,h=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')h=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(long long)(ch-'0');ch=getchar();}
	return x*h;
}

void q_sort(int l,int r){
	if(l>=r)return ;
	int mid=a[(l+r)>>1];
	int i=l,j=r;
	do {
		while(a[i]<mid&&i<=j)i++;  // 小于号!!!
		while(a[j]>mid&&i<=j)j--;  // 小于号!!!
		if(i<=j){  // 小于等于号!!!
			swap(a[i],a[j]);
			i++;j--;
		}
	}while(i<j);  // 小于号或小于等于都可以!!!
	if(i<r)q_sort(i,r);  // 判断条件要记清!
	if(j>l)q_sort(l,j);  // 判断条件要记清!
	return ;
}

void m_sort(int l,int r){
	if(l==r)return ;
	int mid=(l+r)>>1;
	m_sort(l,mid);m_sort(mid+1,r);
	tot=0;
	int i,j;
	for(i=l,j=mid+1;i<=mid&&j<=r;){
		if(a[i]<=a[j])c[++tot]=a[i++];
		else c[++tot]=a[j++];
	}
	while(i<=mid)c[++tot]=a[i++];
	while(j<=r)c[++tot]=a[j++];
	for(i=l,j=1;i<=r;i++,j++)a[i]=c[j];
	return ;
}

int main(){
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
//	q_sort(1,n);
//	m_sort(1,n);
	for(int i=1;i<=n;i++)printf("%d ",a[i]); 
	return 0;
}

posted @ 2021-10-08 23:35  Charisk_FOD  阅读(51)  评论(0)    收藏  举报