您的位置:首页 > 编程语言

算法导论 第二章 例子与习题代码 插入排序 归并排序

2014-05-13 11:20 609 查看
头文件:

#ifndef CHAPTER2_H
#define CHAPTER2_H
#include<iostream>
#include <algorithm>
#include<vector>
#include<map>

const size_t OUT_OF_RANGE=100;
const int INFINITE=100;

void array_display(int* A,size_t n)
{
for(size_t i=0;i<n;i++)
{
std::cout<<A[i]<<" ";
}
std::cout<<std::endl;
}
//insertion sort
void insertion_sort(int* A,size_t n)
{
for(size_t j=1;j<n;j++)
{
int key=A[j];
size_t i=j-1;
while(i>=0&&A[i]>key)
{
A[i+1]=A[i];
i--;
}
A[i+1]=key;
}
}
//merge sort
void merge(int* a,size_t p,size_t q,size_t r)
{
size_t n1=q-p+1;
size_t n2=r-q;
std::vector<int> L(a+p,a+q+1);
std::vector<int> R(a+q+1,a+r+1);
L.push_back(INFINITE);
R.push_back(INFINITE);
size_t i=0;
size_t j=0;
for(size_t k=p;k<=r;k++)
if(R[j]<L[i])
{
a[k]=R[j];
j++;
}
else
{
a[k]=L[i];
i++;
}
}
void merge_sort(int* a,size_t p,size_t r)
{
if(p<r)
{
size_t q=(p+r)/2;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}
}
//2.3-4
void insertion_sort_recursive(int*a ,size_t n)
{
if(n>0)
{
insertion_sort_recursive(a,n-1);
int key=a[n-1];
size_t i=n-2;
while(i>=0&&a[i]>key)
{
a[i+1]=a[i];
i--;
}
a[i+1]=key;
}
}
//2.2-3
void selection_sort(int* a,size_t n)
{
for(size_t i=0;i<n-1;i++)
{
int min_ele=a[i];
size_t min_index=i;
for(size_t j=i+1;j<n;j++)
{
if(a[j]<min_ele)
{
min_ele=a[j];
min_index=j;
}
}
std::swap(a[min_index],a[i]);
}
}
//2.3-6
size_t binary_search_iterative
(int* a,int v,size_t low,size_t high)
{
while(low<=high)
{
size_t mid=(low+high)/2;
if(a[mid]==v)
return mid;
else if(a[mid]>v)
high=mid-1;
else low=mid+1;
}
return OUT_OF_RANGE;
}
size_t binary_search_recursive
(int* a,int v,size_t low,size_t high)
{
if(low>high)
return OUT_OF_RANGE;
size_t mid=(low+high)/2;
if(v==a[mid])
return mid;
else if(v>a[mid])
return binary_search_recursive(a,v,mid+1,high);
else
return binary_search_recursive(a,v,low,mid-1);
}
//2.3-7
std::multimap<size_t,size_t> find_company
(int* a,int v,size_t low,size_t high)
{
insertion_sort(a,high-low+1);
array_display(a,high-low+1);
std::multimap<size_t,size_t> vp;
for(size_t i=low;i<=high;i++)
{
size_t tmp=binary_search_recursive(a,v-a[i],low,high);
//size_t tmp=binary_search_iterative(a,v-a[i],low,high);
if(tmp!=OUT_OF_RANGE)
vp.insert(std::pair<size_t,size_t>(i,tmp));
}
return vp;
}
//2.2
void bubble_sort(int* a,size_t n)
{
for(size_t i=0;i<n-2;i++)
for(size_t j=n-1;j>i;j--)
if(a[j]<a[j-1])
std::swap(a[j],a[j-1]);
}
//2.4
size_t merge_inversion(int* a,size_t p,size_t q,size_t r)
{
size_t n1=q-p+1;
size_t n2=r-q;
std::vector<int> L(a+p,a+q+1);
std::vector<int> R(a+q+1,a+r+1);
L.push_back(INFINITE);
R.push_back(INFINITE);
size_t i=0;
size_t j=0;
size_t inver=0;
for(size_t k=p;k<=r;k++)
if(R[j]<L[i])
{
inver+=n1-i;
a[k]=R[j];
j++;
}
else
{
a[k]=L[i];
i++;
}
return inver;
}
size_t count_inversions(int* a,size_t p,size_t r)
{
size_t inversions=0;
if(p<r)
{
size_t q=(p+r)/2;
inversions+=count_inversions(a,p,q);
inversions+=count_inversions(a,q+1,r);
inversions+=merge_inversion(a,p,q,r);
}
return inversions;
}

#endif测试文件:
#include "chapter2.h"
void main()
{
int a[]={5,2,4,6,1,3};
//int a[]={2,3,8,6,1};
//int n=6;
//size_t p=0;
//size_t r=4;
//size_t q=(p+r)/2;
//size_t n1=q-p+1;
//size_t n2=r-q;
//std::vector<int> L(a+p,a+q+1);
//std::vector<int> R(a+q+1,a+r+1);
//L.push_back(INFINITE);
//R.push_back(INFINITE);
//bubble_sort(a,n);
//insertion_sort(a,n);
//selection_sort(a,n);
//insertion_sort_recursive(a,n);
merge_sort(a,0,5);
//size_t c=count_inversions(a,0,5);
//std::cout<<c<<std::endl;
array_display(a,6);
//size_t index=binary_search_iterative(a,1,0,5);
//std::cout<<index<<std::endl;
//std::multimap<size_t,size_t> vp=find_company(a,7,0,5);
//std::cout<<"the size of vp "<<vp.size()<<std::endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: