排序算法整理(2)归并排序

来源:互联网 发布:女款羽绒服淘宝网购物 编辑:程序博客网 时间:2024/05/21 00:46

貌似需要整理一下排序算法了,正好最近在看的宋劲杉的《LINUX一站式编程》也提到了几个排序算法,于是决定把几个常见的排序算法都写写吧。

归并排序用到了分治(divide and conquer)的思想。

如果要排序当前的数组,那么只需要排序当前数组的前1/2和后1/2,然后把它们合并起来。如果要排序前1/2,那么只需要排序这个1/2数组的前1/2和这个1/2数组的1/2,再把它们合并起来。

不断拆分下去…

如果当前数组的元素个数为1了,那就没法再拆分下去了,于是开始归并。

//下面两个函数用来依次打印数组。功能一样,参数不一样,这是为了方便不同的数据类型的调用要求。

void print_num_1(uint32_t* arr, uint32_t len){    for(int i=0;i<len;i++)        std::cout<<arr[i]<<"\t";    std::cout<<std::endl;    return;}void print_num_2(int* arr, int len){    for(int i=0;i<len;i++)        std::cout<<arr[i]<<"\t";    std::cout<<std::endl;    return;}

下面是我的版本的mergesort, 和书上的版本基本上比较像,所以就写这一个版本了。

void merge_sort_1(uint32_t* arr, uint32_t st,  uint32_t ed ){    uint32_t len_3=ed-st+1;    uint32_t len_2=0;    uint32_t len_1=0;    uint32_t mid=0;    uint32_t* arr2=new uint32_t[len_3];    if( st == ed )    {       return;    }else{       mid=(st+ed)/2;       merge_sort_1(arr, st, mid);       merge_sort_1(arr, mid+1, ed);       len_3=ed-st+1;       len_2=ed-mid;       len_1=mid-st+1;       uint32_t i=0;       uint32_t j=st;       uint32_t k=mid+1;       while((j<mid+1)&&(k<ed+1))   //注意区分数组的下标的绝对长度和相对长度,ERROR: while((j<len_1)&&(k<len_2))        {          if(arr[j]<=arr[k]){              arr2[i++]=arr[j++];   // std::cout<<"1 i="<<i<<",arr2[i]="<<arr2[i]<<std::endl;          }else{              arr2[i++]=arr[k++];   //   std::cout<<"2 i="<<i<<",arr2[i]="<<arr2[i]<<std::endl;          }                 }       while(j<mid+1)       {          arr2[i++]=arr[j++];       //   std::cout<<"3 i="<<i<<",arr2[i]="<<arr2[2]<<std::endl;       }        while(k<ed+1)       {           arr2[i++]=arr[k++];       }       for (int b=st,k=0;b<=ed;b++,k++)       {    arr[b]=arr2[k];       }       delete [] arr2;       return;    }   }




原创粉丝点击