/* *算法描述:1、把前一半排序 2、把后一半排序 3、把两半归并到一个新的有序数组,然后再拷贝到原数组,排序完成 */ #include <iostream> 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,e] 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]; } void MergeSort(int a[],int s,int e,int tmp[])//把数组a从下标s到e的部分进行归并排序,tmp是中转数组 { if(s < e) { int m = s +(e-s)/2;//m作为s和e的中点 MergeSort(a,s,m,tmp);//把前一半排序 MergeSort(a,m+1,e,tmp);//把后一半排序 Merge(a,s,m,e,tmp);//把两半归并到一个新的有序数组,然后再拷贝到原数组,排序完成 } } int a[10] = {25,96,65,48,51,24,12,39,91,24}; 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; }
新闻热点
疑难解答