基础算法(快排和归并排序)

1.快排

快排能够较快速的把混乱的序列排列好
快排主要是利用指针,将前后不一样的数进行调换
快排模板 :

#include <iostream>
using namespace std;

const int N=1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l,int r)
{
	if(l>=r) return ;//当要排序的数只有一位时,返回
	int x=q[(l+r)/2],i=l-1,j=r+1; //此处的x最好取中间的值,有时候可能会卡这里的时间
	while(i<j)
	{
		do i++ while(q[i]<x) //找到前面比x大的数
		do j-- while(q[j]>x) //找到后面比x小的数
		if(i<j)swap(q[i],q[j])//如果此时i还在j的前面,那么就交换这两个数
	}
	quick_sort (q,l,j);
	quick_sort (q,j+1,r);//继续往下进行排序
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>q[i];
	quick_sort(q,0,n-1);
	for(int i=0;i<n;i++) cout<< q[i]<<" ";
	cout<<endl;
	return 0;
}
	

2.归并排序

归并排序也能较快的排序。
归并排序模板:

#include<iostream>
using namespace std;
const int N=1e6+10;
int n;
int q[N];
int tmp[N];//用来存排序好的数列

void merge_sort(int q[],int l,int r)
{
	if(l>=r) return ;//当只有最后一位时,返回
	int mid = l+r >>1;
	merge_sort(q,l,mid);
	merge_sort(q,mimd+1,r);
	int k=0,i=0, j= mid+1;
	while(i<=l&&j<=r)
	{
		if(q[i]<q[j]) tmp[k++] = q[i++] ;//把小的数存进空数组tmp;
		else tmp[k++] = q[j++] ;
	}
	while(i<=mid) tmp[k++] = q[i++]; // 此处可能有没有存完的数
	while(j<=r) tmp[k++] = q[j++]; //把没有存完的数存入tmp[]
	for(int i=l,k=0;i<=r;i++,k++) 
		q[i] = tmp[k];//把tmp[]中的数存回q[]
	
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>q[i];
	merge_sort(q,0,n-1);
	for(int i=0;i<n;i++) cout<<q[i]<<" ";
	cout<<endl;
	return 0;
}

快排和归并的时间复杂度差不多,只是两者的排序方法不同,快排时自上而下(先排多,再排少),而归并排序是自下而上(先排少,再排多)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值