算法导论系列文章之插入排序和归并排序

来源:互联网 发布:威力导演 知乎 编辑:程序博客网 时间:2024/05/16 00:38

本博文为算法导论系列的文章,博文的代码在VS2012下均编译通过,其实就是笔者把原书中的伪代码用c++写了出来而已.

前言:最近再看算法导论,所以打算按照学习进度把自己写的demo都发上来..

这次是 插入排序和归并排序..

至于这两种排序的时空复杂度之类的就不多说了,百度之..谷歌之..


所有的代码语言都是c++,编译环境是 vs2012..


//插入排序算法.//2013.12.25#include <iostream>using namespace std;typedef int ele;void InsertSort(ele sortArr[],int length);int main (){ele arr[]={5,3,5,2,7,4,7,4,8,3,8,9,4,8,4};auto length=15;InsertSort(arr,length);for(auto i=0;i<length;i++){cout<<arr[i]<<" ";}system("pause");return 0;}void InsertSort(ele sortArr[],int length){//插入排序,从第二个元素开始.for(auto i=1;i<length;i++){ele key=sortArr[i];auto j=i-1;while (j>=0&&sortArr[j]>key){sortArr[j+1]=sortArr[j];j--;}sortArr[j+1]=key;}return;}


//归并排序.//2013.12.25#include <iostream>using namespace std;typedef int ele;void Merge(ele arrSort[],int left,int mid,int right);void MergeSort(ele arrSort[],int left,int right);int main(){ele arr[]={3,1,7,3,2,4,4,3,3,0,5,3,2};auto length=12;MergeSort(arr,0,length);for(auto i=0;i<length;i++){cout<<arr[i]<<" ";}system("pause");return 0;}void Merge(ele arrSort[],int left,int mid,int right){int n1=mid-left;int n2=right-mid;ele *leftArr=new ele [n1+1];ele *rightArr=new ele [n2+1];for(int i=0;i<n1;i++)leftArr[i]=arrSort[left+i];for(int j=0;j<n2;j++)rightArr[j]=arrSort[mid+j];//注意此处,很巧妙,可以防止后续讨论.leftArr[n1]=INT_MAX;rightArr[n2]=INT_MAX;int a=0,b=0;for(int k=left;k<right;k++){if(leftArr[a]<=rightArr[b]){arrSort[k]=leftArr[a];a++;}else{arrSort[k]=rightArr[b];b++;}}}void MergeSort(ele arrSort[],int left,int right){if(right-left>1){int mid=(left+right)/2;MergeSort(arrSort,left,mid);MergeSort(arrSort,mid,right);Merge(arrSort,left,mid,right);}}


0 0
原创粉丝点击