归并排序算法C实现 归并算法采用的是经典的分治策略(divide-and-conquer),将问题分解成小问题,然后在治的阶段将分阶段得到的答案合并。 /* * main.cpp * * Created on: 2010-9-7 * Author: yangyu */ //归并排序 #include <iostream> #include <malloc.h> using namespace std; // 归并排序中的合并算法 void Merge(int a[], int left, int center, int len) { int *t = (int *) malloc((len-left+1) * sizeof(int)); //申请空间,大小为两个已经排序序列之和,该空间用来存放合并后的序列 int i = left; int j = center; int k = 0; while (i<center && j<len) //比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 { if (a[i] <= a[j]) t[k++] = a[i++]; else t[k++] = a[j++]; } while (i < center) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾 t[k++] = a[i++]; while (j < len) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾 t[k++] = a[j++]; //将排序好的序列拷贝回数组中 for (i=left,k=0; i<len; i++,k++) a[i] = t[k]; free(t); } // 归并排序 void MSort(int a[], int left, int right) { if (left < right) { int center = (left + right) / 2; // 对前半部分进行排序 MSort(a, left, center); // 对后半部分进行排序 MSort(a, center+1, right); // 合并前后两部分 Merge(a, left, center+1, right+1); } } void MergeSort(int a[], int n) { MSort(a, 0, n-1); //================================= for(int i=0;i<n;i++) { if(i%5==0) cout<<endl; cout<<a[i]<<" "; } cout<<endl; } int main() { int A[6] = {65,23,54,12,8,27}; MergeSort(A,6); return 0; }