归并排序算法及其记忆要点

文章目录

    • 1 .归并排序的思想
    • 2.归并排序函数解析
    • 完整测试代码

1 .归并排序的思想

归并排序这个算法,让我回忆到一道算法题目,就是两个有序的数组合并成一个有序的数组,相信经常刷题的同学一定很熟悉这个题目。
实际上归并排序就是把数组拆分成一个一个的元素,然后两两都是有序数组,再进行合并。
这里要说明的是,大话数据结构这本书中的归并排序(递归版)的代码我不是很推荐,代码相对而言较为复杂一点,不好理解。

2.归并排序函数解析

和快排函数形式类似,我们也有三个函数。

void MergeSort(List *L);
void MSort(int arr[],int low,int high);
void Merge(int arr[], int low,int mid,int high);

MergeSort是入口函数,MSort是用来递归的函数,Merge是真正做事情的函数。

MergeSort很简单,只是一个入口

void MergeSort(List *L)
{
    MSort(L->r,1,L->length);
}

接下来是MSort

void MSort(int arr[],int low,int high)
{
    if(low >= high)
    {
        return;
    }

    int mid = low + (high - low)/2;
    MSort(arr,low,mid);
    MSort(arr,mid+1,high);
    Merge(arr,low,mid,high);
}

MSort函数也是用来递归的,其一定有递归终止条件,就是low>=high,
low=high的时候意味这数组已经被拆成了只剩一个元素。首先MSort左半边,再MSort 右半边,最后Merge

Merge函数就很简单了,就是两个有序数组合并成一个数组
arr[low,m]是第一个数组,arr[m+1,high]是第二个数组。

void Merge(int arr[], int low,int mid,int high)
{
    int i = low,j = mid+1,k=0;
    int *temp = new int[high-low+1];
    while(i <= mid&& j<=high)
    {
        if(arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }
    while(i<=mid)
    {
        temp[k++] = arr[i++];
    }
    while(j<=high)
    {
        temp[k++] = arr[j++];
    }
    for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
	    arr[i]=temp[k];
    delete []temp;//释放内存,由于指向的是数组,必须用delete []
}

完整测试代码

#include 
#define MAXSIZE 10000
typedef struct 
{
    int r[MAXSIZE];
    int length;
}List;
void swap(List*l,int i,int j);
void print(List *l);
void Merge(int arr[], int low,int mid,int high);
void MSort(int arr[],int low,int high);
void MergeSort(List *L);

void swap(List *l,int i,int j)
{
    int temp = l->r[i];
    l->r[i] = l->r[j];
    l->r[j] = temp;
}
void print(List *l)
{
   int i = 0;
   for (i =0;ilength;i++)
   {
        printf("%d ",l->r[i]);
   }
   printf("%d ",l->r[i]);
   printf("\n");
}




void MergeSort(List *L)
{
    MSort(L->r,1,L->length);
}


void MSort(int arr[],int low,int high)
{
    if(low >= high)
    {
        return;
    }

    int mid = low + (high - low)/2;
    MSort(arr,low,mid);
    MSort(arr,mid+1,high);
    Merge(arr,low,mid,high);
}



void Merge(int arr[], int low,int mid,int high)
{
    int i = low,j = mid+1,k=0;
    int *temp = new int[high-low+1];
    while(i <= mid&& j<=high)
    {
        if(arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }
    while(i<=mid)
    {
        temp[k++] = arr[i++];
    }
    while(j<=high)
    {
        temp[k++] = arr[j++];
    }
    for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
	    arr[i]=temp[k];
    delete []temp;//释放内存,由于指向的是数组,必须用delete []
}




int main()
{
   int d[9] = {80,10,20,90,30,60,70,40,50};
   List l1;
   int i =0 ;
   for (i=0;i<9;i++)
   {
        l1.r[i+1] = d[i];
   }
   l1.length=9;
   print(&l1);
   MergeSort(&l1);
   print(&l1);
}

你可能感兴趣的:(后台开发面试题)