合并排序的递归与非递归写法
来源:互联网 发布:淘宝众筹不成功会怎样 编辑:程序博客网 时间:2024/05/17 07:08
作业题:
(1)采用递归合并排序算法,根据基站k-dist距离,对基站从小到大进行排序,观察、统计递归层次。
(2)采用非递归合并排序算法,根据基站k-dist距离,对基站从小到大进行排序
合并排序基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序; 将排好序的子集合合并成为所要求的排好序的集合。
递归:
#include<iostream>#include<string>#include<fstream>#define max 2000using namespace std;typedef struct Basestation{int ENODEBID;float LONGITUDE;//经度 float LATITUDE;//纬度 float K_DIST ; }Basestation; Basestation a[max], b[max];void MergeSort(int left, int right);void Merge(int left, int mid, int right); int main(){int i = 1;int num = 0;ifstream file;file.open("Data_Of_Basestation.txt", ios::in);if(file.bad()){cout<<"打开文件时发生错误"<<endl;return 0;}while(!file.eof()){file>>a[i].ENODEBID>>a[i].LONGITUDE>>a[i].LATITUDE>>a[i].K_DIST;i++;num++;//cout<<a[i].ENODEBID<<" "<<a[i].LONGITUDE<<" "<<a[i].LATITUDE<<" "<<a[i].K_DIST<<endl;file.get();if(file.peek()==EOF)break;}MergeSort(1, num);cout<<"排序结果:"<<endl;cout<<" 基站编号 "<<"\t"<<" 基站经度 "<<"\t"<<" 基站纬度 "<<"\t"<<" K_DIST "<<endl; for(int j=1; j<=num; j++){cout<<a[j].ENODEBID<<"\t"<<a[j].LONGITUDE<<"\t"<<a[j].LATITUDE<<"\t"<<a[j].K_DIST<<endl;}file.close();return 0; } void MergeSort(int left, int right){if(left<right){int mid;mid = (left + right) / 2;MergeSort(left, mid);//左半部排序MergeSort(mid+1, right);//右半部排序Merge(left, mid, right);//左右合并排序 } } void Merge(int left, int mid, int right)//两个子段序列的合并操作 {int i = left;int j = mid+1;int k = left;while(i<=mid && j<=right){if(a[i].K_DIST<=a[j].K_DIST)b[k++] = a[i++];elseb[k++] = a[j++];}if(i>mid){for(int q=j; q<=right; q++)b[k++] = a[q];}else{for(int q=i; q<=mid; q++)b[k++] = a[q];}for(int h=left; h<=right; h++)//将左右合并在b中排序完成的序列复制到a数组 {a[h] = b[h];}}
非递归写法:将数组划分为隔s的一个个小片段,对每个小片段进行排序,s增加后对应数组片段边长,对每个片段进行排序意味为对更低级的两个片段进行合并
#include<iostream>#include<string>#include<fstream>#define max 2000using namespace std;typedef struct Basestation{int ENODEBID;float LONGITUDE;//经度 float LATITUDE;//纬度 float K_DIST ; }Basestation; Basestation a[max], b[max];void MergeSort(Basestation a[], int n);void MergePass(Basestation x[], Basestation y[], int s, int n);void Merge(Basestation x[], Basestation y[], int left, int mid, int right);int main(){int i = 1;int num = 0;ifstream file;file.open("Data_Of_Basestation.txt", ios::in);if(file.bad()){cout<<"打开文件时发生错误"<<endl;return 0;}while(!file.eof()){file>>a[i].ENODEBID>>a[i].LONGITUDE>>a[i].LATITUDE>>a[i].K_DIST;i++;num++;//cout<<a[i].ENODEBID<<" "<<a[i].LONGITUDE<<" "<<a[i].LATITUDE<<" "<<a[i].K_DIST<<endl;file.get();if(file.peek()==EOF)break;}MergeSort(a, num);cout<<"排序结果:"<<endl;cout<<" 基站编号 "<<"\t"<<" 基站经度 "<<"\t"<<" 基站纬度 "<<"\t"<<" K_DIST "<<endl; for(int j=1; j<=num; j++){cout<<a[j].ENODEBID<<"\t"<<a[j].LONGITUDE<<"\t"<<a[j].LATITUDE<<"\t"<<a[j].K_DIST<<endl;}file.close();return 0; } void MergeSort(Basestation a[], int n){int s = 1;while(s<n){MergePass(a, b, s, n);s+=s;MergePass(b,a,s,n);s+=s;}}void MergePass(Basestation x[], Basestation y[], int s, int n){int i=0;while(i<=n-2*s){Merge(x, y, i, i+s-1, i+2*s-1);i+=2*s;}if(i+s<=n)Merge(x, y, i, i+s-1, n);elsefor(int j=i; j<=n; j++)y[j] = x[j];}void Merge(Basestation a[], Basestation b[], int left, int mid, int right)//两个子段序列的合并操作 {int i = left;int j = mid+1;int k = left;while(i<=mid && j<=right){if(a[i].K_DIST<=a[j].K_DIST)b[k++] = a[i++];elseb[k++] = a[j++];}if(i>mid){for(int q=j; q<=right; q++)b[k++] = a[q];}else{for(int q=i; q<=mid; q++)b[k++] = a[q];}}
0 0
- 合并排序的递归与非递归写法
- 递归与非递归的各种写法
- 合并排序的三种不同写法,包括递归和非递归
- 非递归合并排序
- 非递归合并排序
- 合并排序-非递归
- 快速排序之递归与非递归写法
- 快速排序的非递归写法
- 合并排序(归并排序)的递归和非递归
- 合并排序的非递归算法
- 合并排序的非递归实现
- 合并排序的非递归实现
- 归并排序非递归写法
- 合并排序算法(非递归)
- 合并排序(非递归算法)
- 非递归实现合并排序
- 合并排序非递归实现
- 全排列的递归与非递归写法
- Ubuntu 14.04配置Shadowsocks和Privoxy实现浏览器和终端代理
- 作用域之词法作用域
- 快速幂运算(数论知识)
- 安卓log工具类总结
- vue结合elementUI,MinUi
- 合并排序的递归与非递归写法
- 【GDOI2017模拟一试4.11】腐女的生日
- ffmpeg编译
- spring使用@ExceptionHandler、@ControllerAdvice统一异常处理
- 数据结构与算法---直接插入排序
- Activity的四种启动模式和onNewIntent()
- 删除子串
- 两个有序链表合并成一个有序链表
- meanshift运动跟踪算法详解