归并排序&&快速排序----分治思想
蒟蒻来水一篇博文方便复习参考
-
快速排序
快速排序的基本原理:随机选择一个基点,将比基点大的元素放在基点左侧,将比基点小的元素放在基点右侧。然后再分别只看基点左侧和右侧,重复上述过程。
由于其利用了分治思想,在平均状态下其时间复杂度为O(nlogn).
基本代码如下:
#include<bits/stdc++.h>
using namespace std;
void qsort(int a[],int s,int m);//排序函数
int main()
{
int N;
cin>>N;
int a[N];
for(int i=0;i<N;i++)
{
cin>>a[i];
}
qsort(a,0,N-1);
for(int i=0;i<N;i++)
{
cout<<a[i]<<" ";
}
}
void qsort(int a[],int s,int m)
{
int i=s,j=m;//i从左侧开始扫描,j从右侧开始扫描
int pivot=a[s];//基点选取(在这里选择最左端的一项作为基点)
if(s>=m)
return;
while(i!=j)
{
while(a[j]>pivot&&j>i)
{
j--;
}
swap(a[i],a[j]);
while(a[i]<pivot&&i<j)
{
i++;
}
swap(a[i],a[j]);
}
qsort(a,s,i-1);//分别对初步排序后基点左侧和右侧分析
qsort(a,i+1,m);
}
-
归并排序
归并排序的基本原理:将待排序数组一分为二,对于左右两侧,再次分别一分为二递归进行,最后进行合并,
其时间复杂度同快速排序同为O(nlogn)。其主要思想为分治思想。
代码如下:
#include<bits/stdc++.h>
void msort(int a[],int s,int m,int b[]);//分函数
void merge(int a[],int s,int mid,int m,int b[]);//归并函数
using namespace std;
int main()
{
int N;
cin>>N;
int a[N],b[N];
for(int i=0;i<N;i++)
{
cin>>a[i];
}
msort(a,0,N-1,b);
for(int i=0;i<N;i++)
{
cout<<b[i]<<" ";
}
return 0;
}
void msort(int a[],int s,int m,int b[])
{
if(s>=m)
return;
int mid=s+(m-s)/2;
msort(a,s,mid,b);
msort(a,mid+1,m,b);
merge(a,s,mid,m,b);
}
void merge(int a[],int s,int mid,int m,int b[])
{
if(s>=m)
return;
int i=s,j=mid+1,t=0;
while(i<=mid&&j<=m)//并操作,排序主要在此部分完成
{
if(a[i]>a[j])
b[t++]=a[j++];
else
b[t++]=a[i++];
}
while(i<=mid)
{
b[t++]=a[i++];
}
while(j<=m)
{
b[t++]=a[j++];
}
for (int k = 0; k < m - s + 1; ++k)
a[s + k] = b[k];//不能省略这一步(写了两次了都,都是省略了这一步出的错误),仔细品.
}

浙公网安备 33010602011771号