归并排序
来源:互联网 发布:sql promp8破解 编辑:程序博客网 时间:2024/06/14 11:07
归并排序的思想是分治法。先进行划分,然后对划分得到的部分分别排序进行递归继续划分,最后达到条件后退出递归,逐层合并。
一方面在进行划分时,划分的重点的计算为了防止数据的溢出,不要采用m=(x+y)/2而应当采用m=x+(y-x)/2的方式。
主要需要注意的地方在于合并时的条件,在进行合并时,只要两个部分中有一个部分为空即可进行复制到暂存数组,如果都不为空,则要判断大小看是将左边部分还要右边部分复制到暂存数组。
代码如下:
#include <iostream>#include <string>using namespace std;#define Maxn 100int temp[Maxn] = { 0 };int A[Maxn] = { 9, 4, 5, 3, 2, 1, 8, 4, 10, 52, 15, 66 };void merge_sort(int *T, int x, int y, int *Temp_Arr){ //注意以后对于这种划分的操作都采用左开右闭的形式[x,y),这样方便自己思考,所以这里的条件是y-x>1 //另外二分的时候采用m = x+(y-x)/2的形式,避免直接x+y时数据溢出 if (y - x > 1) { int m = x + (y - x) / 2; merge_sort(T, x, m, Temp_Arr); merge_sort(T, m, y, Temp_Arr); int p = x, q = m, k = x;//这里pq的意义是个易错点,主要是为了后面找A中的值赋给暂存数组用的,不要想错了 while (p < m || q < y) { //比较左右两侧的数据谁大谁小,小的入暂存数组 if (p < m&&T[p] <= T[q] || q >= y)Temp_Arr[k++] = T[p++]; else Temp_Arr[k++] = T[q++]; } for (int i = x; i < y; i++) T[i] = Temp_Arr[i]; }}int main(){ merge_sort(A, 0, 8, temp); return 0;}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 欢迎使用CSDN-markdown编辑器
- WiFi-ESP8266入门开发(二)-连接WiFi网络
- Spring基础(2)
- oracle pl/sql脚本常用技巧
- MyEclipse中如何去掉JS/JSP语法错误提示
- 归并排序
- epoll服务器
- axi学习总结
- 简单++--运算符
- PHP基础入门(四)---PHP数组实用基础知识
- Spring基础(3)
- jQuery全屏banner焦点图切换
- 混淆网络和词格或者字格
- Codeforces Round #422 D. My pretty girl Noora (数论)