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;
}
快排和归并的时间复杂度差不多,只是两者的排序方法不同,快排时自上而下(先排多,再排少),而归并排序是自下而上(先排少,再排多)。