• C++
  • 快速排序和归并排序的模版

  • @ 2024-7-4 10:02:08

快速排序

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;

int n;
int q[N];

void QuickSort(int q[], int l, int r)
{
	cout<<"l:"<<l<<"r:"<<r<<endl;
	if (l >= r) return; // 递归终止条件,一个或者0个数,不用排序 
	int x = q[(l + r) / 2];//选取分界线。这里选数组中间那个数
	int i = l-1, j = r+1; 
//划分成左右两个部分
	while (i < j)
	{
		// 这里写成do while 循环
		do i++; while (q[i] < x); 
		do j--; while (q[j] > x);
		if (i < j) swap(q[i], q[j]);
	}
//对左右部分排序
	QuickSort(q, l, j);
	QuickSort(q, j+1, r);
}
int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++) scanf("%d", &q[i]);
	
	QuickSort(q, 0, n-1);
	
	for (int i = 0; i < n; i++) printf("%d ", q[i]);    
	return 0;
}

归并排序:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int n,m=0;
long long q[N];

void mt(long long q[],int l,int r){
	if(l>=r)return; 
	int mid = l+(r-l)/2;
	mt(q,l,mid);
	mt(q,mid+1,r);
	int k=0,i=l,j=mid+1,tmp[r-l+1];
	while(i<=mid&&j<=r)
		if(q[i]<q[j])tmp[k++]=q[i++];
		else {tmp[k++]=q[j++];m=m+(mid-i)+1;}
	while(i<=mid)tmp[k++]=q[i++];
	while(j<=r)tmp[k++]=q[j++];
	for(int k=0,i=l;i<=r;i++,k++)q[i]=tmp[k];
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)scanf("%lld",&q[i]);
	mt(q,0,n-1);
	printf("%d",m);
	return 0;
}

0 条评论

目前还没有评论...