归并排序&&快速排序----分治思想

蒟蒻来水一篇博文方便复习参考

 

 


 

  • 快速排序

快速排序的基本原理:随机选择一个基点,将比基点大的元素放在基点左侧,将比基点小的元素放在基点右侧。然后再分别只看基点左侧和右侧,重复上述过程。

由于其利用了分治思想,在平均状态下其时间复杂度为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];//不能省略这一步(写了两次了都,都是省略了这一步出的错误),仔细品.
}

 

  

 

 

 

posted @ 2021-02-01 17:49  黯战丿风魂  阅读(118)  评论(0)    收藏  举报