这篇笔记是对慕课上郭炜老师的c++课程自己的总结,方便日后复习
思想:
1)把前一半排序。
2)把后一半排序。
3)把两半归并到一个有序数组,然后再拷贝回原数组,排序完成。
#include
using namespace std;
void Merge (int a[] ,int s,int m,int e,int tmp [])
{
//将数组a的局部a[s,m]和a[m+ 1,e]合并到tmp,并保证tmp有序,然后再拷贝回a[s,m]
//归并操作时间复杂度: 0 (e-m+1),即O (n)
int pb=0;
int p1 = s,p2 = m+1;
while(p1<=m&&p2<=e)
{
if( a[p1] < a[p2])
tmp [pb++] = a[p1++] ;
else
tmp [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] ;
}
//以上是 Merge 函数的实现
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) ;
}
}
//此处是 Mergesort 函数的实现 用递归的方法
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) ;//调用Mergesort
for(int i = 0;i < size; ++i)
cout << a[i] << ",";
cout << endl ;
return 0 ; .
}
以下转载一张归并排序图解:
原文https://blog.csdn.net/weixin_41582192/article/details/81239266
●数组排序任务可以如下完成:
1)设k=a[0],将k挪到适当位置,使得比k小的元素都
在k左边,比k大的元素都在k右边,和k相等的,不关心
在k左右出现均可(O (n)时间完成)
2)把k左边的部分快速排序
3)把k右边的部分快速排序
#include
using namespace std;
void swap(int & a,int & b) //引用变量交换变量a ,b值
{
int tmp = a;
a =b;
b = tmp;
}
void QuickSort(int a[] ,int s,int e)
{
if( s>= e)
return;
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]= k
QuickSort(a,s,i-1) ;
QuickSort(a,i+1,e) ;
}
//Quicksort函数递归实现
int a[] = {93,27,30,2,8,12,2,8,30,89};
//以下为主函数
int main ()
{
int size = sizeof(a) /sizeof (int);
QuickSort(a,0,size-1);//调用Quicksort函数
for(int i = 0;i < size; ++i)
cout<< a[i] <<",";
cout<< endl ;
return 0;
}