常用排序算法 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)\) 。

浙公网安备 33010602011771号