归并排序&快速排序【分治】之初见分治

                                                                     图片来自MOOC郭炜老师 

归并排序代码 

#include <iostream>
using namespace std;
const int maxn = 10;
void Merge(int a[],int s,int m,int e,int temp[])
{	
	int p1,p2,k;
	p1 = s;
	p2 = m+1;
	k = 0;
	while(p1 <= m && p2 <= e) {
		if(a[p1] < a[p2])
			temp[k++] = a[p1++];
		else
			temp[k++] = a[p2++];
	}
	while(p1 <= m)
		temp[k++] = a[p1++];
	while(p2 <= e)
		temp[k++] = a[p2++];
	
	
	for(int i=0;i<k;i++)
		a[s++] = temp[i];

}
void MergeSort(int a[],int s,int e,int temp[])	//   start  end
{
	if(s < e) { 
		int mid = s+(e-s)/2;
		MergeSort(a,s,mid,temp);
		MergeSort(a,mid+1,e,temp);
		Merge(a,s,mid,e,temp);
	}
}
int main()
{
	int a[maxn] = {1,8,9,20,0,2,6,34,9,8};
	int temp[maxn];

	MergeSort(a,0,maxn-1,temp);

	for(int i=0;i<maxn;i++)
		cout << a[i] << " ";
	cout << endl;

}

快速排序代码   

时间复杂度O (N*log N),c/c++库里的sort()就是用的快速排序

#include <iostream>
using namespace std;
const int maxn = 10;
void swap(int &a,int &b)
{
	int c = a;
	a = b;
	b = c;
}
void QuickSort(int a[],int l,int r)
{
	if(l > r)
		return;

	int i,j;
	i = l;
	j = r;
	int temp = a[l];
	while(i != j) {
		while(a[j] >= temp && i<j)		// 一定要从先右边开始走
			j--;
		while(a[i] <= temp && i<j)
			i++;

		swap(a[i],a[j]);
	}
	swap(a[l],a[i]);

	QuickSort(a,l,i-1);
	QuickSort(a,i+1,r);
}
int main()
{
	int a[maxn] = {1,8,9,20,0,2,6,34,9,8};
 
	QuickSort(a,0,maxn-1);
 
	for(int i=0;i<maxn;i++)
		cout << a[i] << " ";
	cout << endl;
 
}

 

猜你喜欢

转载自blog.csdn.net/weixin_42765557/article/details/84787579
今日推荐