归并排序

来源:互联网 发布:淘宝系统架构 编辑:程序博客网 时间:2024/06/14 22:39
归并排序:

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。
时间复杂度:
           O(N*lgN)
空间复杂度:
           O(N)   需要额外空间
性能:
           稳定

例:


步骤:
1.主要经历了两个阶段,一个是将无序区间分割成一个一个小区间
2.将分割的小区间依次归并成一个有序的区间

PS:
归并的数据保存在临时空间,最后将临时空间的数据拷贝回原数组,即实现归并。

void Merge(int* temp, int* arr, int left, int right);void MergeSort(int* arr, size_t n){assert(arr);int* temp = new int[n];   //开辟同样大小的临时空间assert(temp);int i = 0;for (i = 0; i < n; ++i){temp[i] = 0;   //初始化}Merge(temp, arr, 0, n-1);      //闭区间delete[] temp;}//归并排序void Merge(int* temp, int* arr, int left, int right){int mid = left + ((right - left) >> 1);if (left >= right){return;}Merge(temp, arr, left, mid);    //分割左区间Merge(temp, arr, mid+1, right);   //分割右区间//此时走到这里,arr已经被划分为一个个小区间//归并到临时区间int begin1 = left;int end1 = mid;int begin2 = mid+1;int end2 = right;int index = 0;while ((begin1 <= end1) && (begin2 <= end2)){//两个区间的值做比较,按从小到大排列if (arr[begin1] <= arr[begin2]){temp[index++] = arr[begin1++];     //此时begin1中的值小,所以先将该数据插入temp}else if (arr[begin1] > arr[begin2]){temp[index++] = arr[begin2++];}}//出了该循环,可能是一个条件不满足,或者是两个都不满足,需要判断//而且不可能两个条件都满足,所以先后顺序无影响while (begin1 <= end1){temp[index++] = arr[begin1++];}while (begin2 <= end2){temp[index++] = arr[begin2++];}//此时,数组元素已经全部排序完毕,需要拷贝回原数组int i = 0;for (i = 0; i < index; ++i){arr[left+i] = temp[i];cout << arr[left+i]<<" ";}cout << endl;}

void Test(){int arr[] = { 1, 5, 7, 0, 9, 3, 222, 67, 89, 56, 32, 12 };size_t n = sizeof(arr) / sizeof(arr[0]);MergeSort(arr, n);}int main(){Test();system("pause");return 0;}

原创粉丝点击