排序算法

一、归并排序

#include <bits/stdc++.h>
using namespace std;
int a[1009],temp[1009],n,ans;
void merge(int a[],int l,int mid,int r,int temp[])
{
	int p1=l,p2=mid+1,num=l;
	while(p1<=mid&&p2<=r)
	{
		if(a[p1]<=a[p2])		temp[num++]=a[p1++];
		else	temp[num++]=a[p2++],ans+=mid-p1+1;
		//若想用归并排序求逆序对,当a[p1]>a[p2]时,p1到mid的元素一定和a[p2]形成逆序对,即ans+=mid-p1+1;
	}
	while(p1<=mid)	temp[num++]=a[p1++];
	while(p2<=r)	temp[num++]=a[p2++];
	for(int i=l;i<=r;i++)
		a[i]=temp[i];
	return;
}
void mergesort(int a[],int l,int r,int temp[])
{
	if(l<r)
	{
	int mid=(l+r)/2;
	mergesort(a,l,mid,temp);
	mergesort(a,mid+1,r,temp);
	merge(a,l,mid,r,temp);
	}
}
int main()
{
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++)	cin>>a[i];
	mergesort(a,1,n,temp);
}

二、快速排序

#include <bits/stdc++.h>
using namespace std;
int n;
int a[10009];
void swap(int &a,int &b)
{
	int temp=a;a=b;b=temp;
	return;
}
void quicksort(int a[],int l,int r)
{
	if(l>=r)	return;
	int i=l,j=r,k=a[l];//把比K小的移到左边,大的右边 
	while(i!=j)
	{
		while(j>i&&k<=a[j])	j--;
		swap(a[i],a[j]);
		while(j>i&&a[i]<=k)	i++;
		swap(a[i],a[j]);		
	}
	quicksort(a,l,i-1);
	quicksort(a,i+1,r);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i];
	quicksort(a,1,n);
}
posted @ 2020-02-17 21:29  倾叶子佮  阅读(102)  评论(0编辑  收藏  举报