归并排序与快速排序

来源:互联网 发布:固态优化设置 编辑:程序博客网 时间:2024/06/08 18:48

分治:把一个任务,分成形式和原任务相同,但规模更小的几个部分任务,分别完成,或只需要选一部完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。

 

典型应用:归并排序、快速排序。

 

一、归并排序

1、将前一半排序

2、将后一半排序

3、把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。

 

具体实现:

1、采用递归,不停将数组二分,直到只剩一个元素排序即不要排序。这一步时间复杂度为

2、归并,设置一个指针指向已排序好的两半数组第一个元素,比较大小将小的放进临时数组,指针加1,直到全部放完,再拷贝回原数组。这一步时间复杂度为

         所以整个算法时间复杂度为


代码如下:

#include <iostream>using namespace std;void Merge(int a[],int s,int m,int e,int tmp[]){int pb=0;int p1=s,p2=m+1;while(p1<=m&&p2<=e){if(a[p1]<a[p2])tmp[pb++]=a[p1++];elsetmp[pb++]=a[p2++];}while(p1<=m)tmp[pb++]=a[p1++];while(p2<=e)tmp[pb++]=a[p2++];for(int i=0;i<e-s+1;i++)a[s+i]=tmp[i];}void MergeSort(int a[],int s,int e,int tmp[]){if(s<e){int m=s+(e-s)/2;MergeSort(a,s,m,tmp);MergeSort(a,m+1,e,tmp);Merge(a,s,m,e,tmp);}}int a[10]={13,27,19,2,8,12,2,8,30,89};int b[10];int main(){int size=sizeof(a)/sizeof(int);MergeSort(a,0,size-1,b);for(int i=0;i<size;i++)cout<<a[i]<<",";cout<<endl;return 0;}

二、快速排序

1、设k=a[0],将k挪到适当位置,似的比k小的元素都在k左边,比k打的元素都在k右边,和k相等的左右均可 (o(n)时间内完成)

2、将k左边的快排

3、将k右边的快排

 

具体实现:

         在数组的首末分别设置两个指针i,j,将两个元素比较,若前者小于后者则i不变,j--,若前者大于后者,则交换顺序且i++,当i=j时则k挪动完成。

         算法时间复杂度同归并排序。


代码如下:

#include <iostream>using namespace std;void swap(int &a,int &b){int tmp=a;a=b;b=tmp;}void QuickSort(int a[],int s,int e){if(s<e){int k=a[s];int i=s,j=e;while(i!=j){while(j>i&&a[j]>=k)j--;swap(a[i],a[j]);while(i<j&&a[i]<=k)i++;swap(a[i],a[j]);}//处理完毕后,a[i]=kQuickSort(a,s,i-1);QuickSort(a,i+1,e);}}int a[10]={13,27,19,2,8,12,2,8,30,89};int main(){int size=sizeof(a)/sizeof(int);QuickSort(a,0,size-1);for(int i=0;i<size;i++)cout<<a[i]<<",";cout<<endl;return 0;}








原创粉丝点击