归并排序;分治算法;复杂度nlgn;附加逆序数算法;
2010-03-29 21:56
190 查看
#include <iostream> using namespace std; class MergeSort//归并排序类 { private: int *arr; //待排序数组 int *temp; //临时记录数组 int length; //数组长度 int num;//逆序对数量 public: //构造函数 MergeSort(int length) { this->length=length; arr=new int[length+1]; temp=new int[length+1]; num=0; } //归并排序递归定义算法 void mergeSort(int start,int end) { int middle; if(start<end) { middle=(start+end)/2; mergeSort(start,middle); mergeSort(middle+1,end); merge(start,middle,end); } } //合并算法 void merge(int start,int middle,int end) { int i=start; int j=middle+1; int k=start; copy(start,end);//拷贝arr[start:end]给temp[start:end] while(i<=middle&&j<=end) { if(temp[i]<=temp[j]) { arr[k++]=temp[i++]; } else { arr[k++]=temp[j++]; num+=middle-i+1;//逆序对记录 ,因为如果arr[i]>arr[j],因为arr[start:middle]已好序呈递增状态,所以arr[i:middle]均大于arr[j],所以有middle-i+1个逆序对 } } while(i<=middle) { arr[k++]=temp[i++]; } while(j<=end) { arr[k++]=temp[j++]; } } //拷贝数组 void copy(int start,int end) { while(start<=end) { temp[start]=arr[start]; start++; } } //输入数据函数 void input() { int i=1; while(i<=length) { cin>>arr[i++]; } } //输出数组排序结果 void display() { int i=1; while(i<=length) { cout<<arr[i++]<<" "; } } }; void main() { MergeSort test(10);//实例化对象 test.input();//输入数据 test.mergeSort(1,10);//将1-10,共10个数据进行排序 test.display();//打印排序后结果 }
相关文章推荐
- 高效算法设计_再谈排序和检索(归并排序,逆序数对)
- 【基础算法】排序-复杂排序之一(归并排序)
- 归并排序的改进算法(使用静态链表)的时间复杂度分析
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 【基础算法】排序-复杂排序之一(归并排序的两种优化讨论)
- 算法 -- 计算逆序数 , significant逆序数 归并排序
- 排序-归并排序与求逆序数的算法--转帖-长见识了
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 求逆序数的快速算法--归并排序
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 【白话经典算法系列之九】 从归并排序到数列的逆序数对(微软笔试题)
- 【算法学习笔记】20.算法设计初步 归并排序 求逆序数
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 分治算法题:nlgn时间复杂度计算原序列的重要逆序个数
- 归并排序的分治算法与时间复杂度分析
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 归并排序与求逆序数的算法
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)