常用排序算法 COMMON SORT ALGORITHM

一、快速排序

一种古老的排序方式。

主流的排序模板中主要有分治二分双指针思想,以初始无序的数列中间数为 \(mid\) ,在 \(mid\) 两边,分别从左到右、从右到左找出大于、小于 \(mid\) 的数进行交换,然后,再对 \(mid\) 两边做相同操作。

优美而简洁。——YXC


#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,a[N];

void quick_sort(int l,int r,int t[]){
	if(l>=r)	return ;
	
	int i=l-1,j=r+1,mid=t[(l+r)>>1];
	while(i<j){
		do	i++;while(t[i]<mid);
		do	j--;while(t[j]>mid);
		if(i<j)	swap(t[i],t[j]);
	}
	
	quick_sort(l,j,t),quick_sort(j+1,r,t);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	quick_sort(1,n,a);
	
	for(int i=1;i<=n;i++)
		printf("%d ",a[i]); 
	return 0;
}

时间复杂度大约 \(O(n\cdot \log n)\)

二、归并排序

仍然有分治、二分、双指针的思想。

主要想法是合并两个有序数列,得到新的有序数列,当两个有序数列只有一个数时,将会非常方便处理。

所以,归并排序先二分,分为左右两个数列,不断二分,数列细分,直到可以瞬间完成交换;再把一层层的左右数列合并。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,a[N];
int tmp[N];

void sorten(int l,int r,int t[]){
	if(l>=r)	return ;
	
	int mid=(l+r)>>1;
	sorten(l,mid,t),sorten(mid+1,r,t);
	
	int k=0,i=l,j=mid+1;
	while(i<=mid && j<=r)
		if(t[i]<=t[j])	tmp[k++]=t[i++];
		else	tmp[k++]=t[j++];
	while(i<=mid)	tmp[k++]=t[i++];
	while(j<=r)	tmp[k++]=t[j++];
	
	for(int i=l,j=0;i<=r;i++,j++)	t[i]=tmp[j]; 
}

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	sorten(0,n-1,a);
	for(int i=0;i<n;i++)
		printf("%d ",a[i]); 
	return 0;
} 

时间复杂度大约 \(O(n\cdot \log n)\)

posted @ 2024-11-13 21:24  丹稳鸿  阅读(33)  评论(0)    收藏  举报