作者:silence、2012年6月12日
本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处
算法思想:采用分治法,将数组进行分解成排序的子数组,然后进行合并成排序的数组
/* Name: MergeSort Copyright: 2012 Author: silence Date: 06-12-12 14:34 Description: 归并排序 */ #include <cstdlib> #include <iostream> using namespace std; //a[]为待排序的数组 //s为数组的起始位置 //m 数组的中间位置 //e 数组的结束为止 void merge(int a[],int s,int m,int e) { //临时数组 int L[100],R[100]; int l ,r; l = m-s+1;//低区长度 r = e-m;// 高区长度 // for(int i =0;i<l;i++) L[i] = a[s+i]; for(int i =0;i<r;i++) R[i] = a[m+i+1]; L[l]=R[r] = 1000; for(int k = s,i=0,j=0;k<=e;k++) { if (L[i] <= R[j]) { a[k] = L[i]; i++; } else { a[k] = R[j]; j++; } } } void MergeSort(int a[],int s,int e) { if(s < e) { int i = (s+e)/2; // 对前半部分进行排序 MergeSort(a, s, i); // 对后半部分进行排序 MergeSort(a, i + 1, e); // 合并前后两部分 merge(a, s, i, e); } } int main(int argc, char *argv[]) { int a[] = {10,6,5,3,2,8,11}; MergeSort(a,0,6); for(int i =0;i<7;i++) cout<<a[i]<<" "; cout<<endl; system("PAUSE"); return EXIT_SUCCESS; }运行结果如下图:
以上的合并算法还有待改进,不够好,以后再补充吧
上面的算法写的我不舒服,因为合并算法实在是恶心,特别是赋最大值的地方。今天补充一下,
两个有序数组合并的算法
/* Name: MergeSort Copyright: 2012 Author: silence Date: 06-14-12 11:44 Description: 有序数组的合并 */ #include <cstdlib> #include <iostream> using namespace std; //a[]为待排序的数组 //s为数组的起始位置 //m 数组的中间位置 //e 数组的结束为止 void merge(int a[],int s,int m,int e) { //临时数组 int L[100],R[100]; int l ,r; l = m-s+1;//低区长度 r = e-m;// 高区长度 for(int i =0;i<l;i++) { L[i] = a[s+i]; } for(int i =0;i<r;i++) { R[i] = a[m+i+1]; } int i =0,j=0,k=s; while(i<l&&j<r)//取尽一个数组 { if(L[i]<=R[j]) a[k++] = L[i++]; else a[k++] = R[j++]; } while(i<l)//剩余的L数组 a[k++] = L[i++]; while(j<r)//剩余的R数组,LR两者只能剩余一个 a[k++] = R[j++]; }基本的也都在代码的注释中,简单暴力