数据结构-排序-归并排序
归并排序
- 什么事归并排序??就是把几个有序序列合并
- 先讲简单的2个有序的归并排序
- 思路很简单,不停的比较两个数组的第一个,谁大就把它插入第三方数组,然后下标++,当某一数组遍历完了,直接把另一个数组剩下的值插入即可。
-
void two_sort(const vector<int>& v1,const vector<int>& v2,vecotr<int>& v3) { int i=0,j=0,k=0; while(i<v1.size()&&j<v2.size()) { if(v1[i]<v2[j]) v3.push_back(v1[i++])else v3.push_back(v2[j++]); } if(i<v1.size()) { while(i<v1.size()) v3.push_back(v1[i++]); } else { while(j<v2.size()) v3.push_back(v2[j++]); } }
理解了这个归并排序那么真正的归并排序也非常简单了。
- 直接上代码
-
/一次归并排序,两个有序序列分别为v[s]~v[m],v[m+1]~v[t],这里把v1看作两个有序列 void Merge(vector<int>& v1,int first,int mide,int last,vector<int>& v2) { int i=first,j=mide+1; while(i<=mide&&j<=last) { if(v1[i]<v1[j]) v2.push_back(v1[i++]); else v2.push_back(v1[j++]); } if(i<mide) { while(i<mide) v2.push_back(v1[i++]); } else { while(j<last) v2.push_back(v1[j++]); } for(int i=0;i<last;i++) v1[i]=v2[i]; } //归并排序递归 void mergesort(vector<int>&v1, int first, int last, vector<int>&v2) { if (first < last) //当first和last相等时候退出循环 { int mid = (first + last) / 2; mergesort(v1, first, mid, v2); //左边有序 mergesort(v1, mid + 1, last, v2); //右边有序 Merge(v1, first, mid, last, v2); //再将二个有序数列合并 } }
转载请标明出处