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

来源:互联网 发布:apache auth身份认证 编辑:程序博客网 时间:2024/05/01 23:07

头文件:

#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 sortvoid 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 sortvoid 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-4void 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-3void 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-6size_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-7std::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.2void 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.4size_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;}


0 0
原创粉丝点击