先在这里记录一下代码!原理将来再补吧!
这个算法算是有一个致命的弱点吧!那就是如果元素的个数达不到2^n个的话,要填充!
#include <iostream> using namespace std; void SortDown(int , int); void MergeUp(int, int); void MergeDown(int, int); void Exchange(int , int); void SortUp(int, int); const int MAXNUM = 99999999; //如果个数不为2的次幂个,要填充的数字 int arr[1024] = { 3, 1, 5, 9, 7, 6, 4, 2, 10, 25, 13, 16, 8, 11, 14, 15, 22 }; int main() { int n = 17; //要排序的元素的个数 int flag = 0; int len = 1; while (len < n)//循环退出的条件 len >= n len = len << 1;//左移一位相当于乘以2 if (len > n)//如果len > n,就说明数组的个数不够,要将个数填充到len个 { flag = 0; for (int i = n; i < len; i++) arr[i] = MAXNUM; } //len = n的话,说明元素的个数恰好是2的次幂个 SortUp(0, len); cout<<"The Sorted Result is:"<<endl; for (int i = 0; i < n; i++) cout << arr[i] << " "; cout << endl; system("pause"); } void SortUp(int beg,int n) { if(n == 1) return; SortUp(beg,n / 2);//把前面的n/2个元素按递增排序 SortDown(beg + n / 2, n / 2);//把后面n/2个元素按递减排序 MergeUp(beg, n);//合并前面n/2个和后面n/2个数组。 return; } void SortDown(int beg,int n)//类似SortUp,只是按照递减排序数组从beg开始的n个元素 { if(n == 1) return; SortUp(beg, n / 2); //把前面的n/2个元素按递增排序 SortDown(beg + n / 2, n / 2); //把后面n/2个元素按递减排序 MergeDown(beg, n); //合并前面n/2个和后面n/2个数组。 } void MergeUp(int beg,int n)//按照从小到大的顺序合并 { if(n == 1) return; int halfN = n >> 1; //向右移一位等同于除以2 for(int i = beg; i < beg + halfN; i++) { if(arr[i] > arr[i + halfN]) Exchange(i, i + halfN); } MergeUp(beg, halfN); MergeUp(beg + halfN, halfN); } void MergeDown(int beg,int n) //按照从大到小的顺序合并 { if(n == 1) return; int halfN = n >> 1; for(int i = beg; i < beg + halfN; i++) //这一步做的是使前后两排相对应位置上的数按照从大到小排列 { if(arr[i] < arr[i + halfN]) Exchange(i, i + halfN); } MergeDown(beg, halfN); //前半部分也要按照从大到小的顺序排列 MergeDown(beg + halfN, halfN); //后半部分也要按照从大到小排列 } void Exchange(int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
原文地址:http://blog.csdn.net/lishuhuakai/article/details/28885793