#include <iostream> using namespace std; //---------------------------------------------------------- // 归并排序(递归实现) // 将有二个有序数列data[first...mid]和data[mid...last]合并 void Merge(int data[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (data[i] <= data[j]) temp[k++] = data[i++]; else temp[k++] = data[j++]; } while (i <= m) temp[k++] = data[i++]; while (j <= n) temp[k++] = data[j++]; for (i = 0; i < k; i++) data[first + i] = temp[i]; } void RecursiveMergeSort(int data[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; RecursiveMergeSort(data, first, mid, temp); // 左边有序 RecursiveMergeSort(data, mid + 1, last, temp); // 右边有序 Merge(data, first, mid, last, temp); // 再将二个有序数列合并 } } bool MergeSort(int data[], int count) { int * buffer = new int[count]; if (buffer == NULL) return false; RecursiveMergeSort(data, 0, count - 1, buffer); delete[] buffer; return true; } //---------------------------------------------------------- // 归并排序(非递归实现) // 将data[]中相邻长度为step的子序列两两归并到temp[] void MergePass(int data[],int temp[],int step, int count) { int i = 0; while(i < count - 2*step) { Merge(data, i, i + step - 1, i + 2*step - 1, temp); // 两两归并 i = i + 2*step; } if(i < count - step) // 归并最后两个序列 Merge(data, i, i + step - 1, count - 1, temp); } bool MergeSort2(int data[], int count) { int * buffer = new int[count]; if (buffer == NULL) return false; int step = 1; while(step < count) { MergePass(data, buffer, step, count); step *= 2; // 子序列长度加倍 } delete[] buffer; return true; } int main() { int array[] = {9, 6, 3, 8, 7, 1, 5, 2, 4}; int count = sizeof(array) / sizeof(array[0]); // MergeSort(array, count); MergeSort2(array, count); for(int i = 0; i < count; ++i) cout << array[i] << " "; cout << endl; return 0; }
归并排序的代码实现(递归与非递归)
最新推荐文章于 2022-03-06 21:52:39 发布