归并排序代码

//递归排序
#include<stdio.h>
#include<stdlib.h>
//归并排序-合并 
void merge(int arr[],int tempArr[],int left,int mid,int right)
{
    //标记左边未排序的元素
    int l_pos=left;
    //标记右边未排序的元素
    int r_pos=mid+1;//从中间分组右边第一个是中间位置+1 
    int pos=left;
     //开始合并
     while(l_pos<=mid&&r_pos<=right)
     {
         if(arr[l_pos]<arr[r_pos])
         tempArr[pos++]=arr[l_pos++];
         else
         tempArr[pos++]=arr[r_pos++];
      } 
      //合并左边剩余的元素
      while(l_pos<=mid)
       {tempArr[pos++]=arr[l_pos++];}//用于右边数据比对完后,跳出了上一个循环,左边数据未放入的问题 
     while(r_pos<=right)
     {
         tempArr[pos++]=arr[r_pos++];
     }
     while(left<=right)
     {
         arr[left]=tempArr[left];
         left++;
     }
}
//归并排序-分治 
void msort(int arr[],int tempArr[],int left,int right)
{
    if(left < right)//表示数组下标,左边小于右边时才表示有两个以上的数据
    {
        //先找中间点
        int mid = (left+right)/2;
        //开始划分左半区
        msort(arr,tempArr,left,mid);
        //开始划分右半区
        msort(arr,tempArr,mid+1,right);
        //开始进行合并操作
        merge(arr,tempArr,left,mid,right);
         
     } //全是递归调用 
}

void merge_sort(int arr[],int n)
{
    //分配一个辅助函数
    int *tempArr=(int *)malloc(n *sizeof(int));
    if(tempArr)
    {
        msort(arr,tempArr,0,n-1);
        free(tempArr);
        
     } 
     else
     {
         printf("空间申请错误!");
     }
}
int main(int argc,char const *argv[])
{
    int arr[]={9,5,2,7,12,4,3,1,11};
    int n=9;
for(int i=0;i<n;i++)
{
    printf("%3d",arr[i]);
    }
    merge_sort(arr,n);
    printf("\n");
for(int i=0;i<n;i++)
{
    printf("%3d",arr[i]);
    }
}

 

posted @ 2022-06-07 22:02  回忆也交给时间  阅读(100)  评论(0编辑  收藏  举报