二路归并排序及数组中逆序对的计算

来源:互联网 发布:杭州seo搜索优化 编辑:程序博客网 时间:2024/03/29 03:09
//二路归并排序,并计算逆序对的个数.二路归并排序算法的性能分析:空间复杂度为O(n),时间复杂度为O(nlog2n),具有稳定性#include<iostream>using namespace std;int count=0;//计算数组中逆序对的个数//设两段有序表data[low...mid]、data[mid+1...high]存放在同一顺序表中相邻的位置上,先将他们复制到辅助数组b中。每次从对应的b中//的两个段取出一个记录进行关键字比较,将较小者放入data中,当数组b中有一段超出其表长时,将另一段中的剩余部分直接复制到A中。void Merge(int data[],int b[],int low,int mid,int high){for(int k=low;k<=high;k++)//将A中的元素都复制到辅助数组b中b[k]=data[k];int i,j,k;for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)//比较b的左右两端的元素,将较小的值复制到A中{if(b[i]>b[j]){data[k]=b[j++];count++;}elsedata[k]=b[i++];}while(i<=mid)data[k++]=b[i++];while(j<=high)data[k++]=b[j++];}void MergeSort(int data[],int b[],int low,int high){if(data==NULL||low>=high)return;int mid=(low+high)/2;MergeSort(data,b,low,mid);MergeSort(data,b,mid+1,high);Merge(data,b,low,mid,high);}void main(){int data[]={2,1,5,7,3,8,4,6};int len=sizeof(data)/sizeof(int);int *b=(int *)malloc(sizeof(int)*(len+1));MergeSort(data,b,0,len-1);for(int i=0;i<len;i++)cout<<data[i]<<" ";cout<<endl;cout<<"逆序对的个数为:"<<count<<endl;free(b);}

0 0
原创粉丝点击