归并排序

来源:互联网 发布:怎样发淘宝买家秀 编辑:程序博客网 时间:2024/06/11 03:30

归并排序是将两个有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。如图所示

这里写图片描述
比较2个数列的第一个数,谁小就先取谁,然后接着进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

#include <stdio.h>void MergeArray(int arr[], int first, int mid, int last, int temp[])//将两个有序数组合并{    int i = first, j = mid+1;    int n = mid, m = last;     int k = 0;    while(i <= n && j <= m)    {        if(arr[i] <= arr[j])            temp[k++] = arr[i++];        else            temp[k++] = arr[j++];    }    while(i <= n)        temp[k++] = arr[i++];    while(j <= m)        temp[k++] = arr[j++];    for(i = 0; i < k; i++)    {        arr[first+i] = temp[i];    }}void MergeInsert(int arr[], int first, int last, int temp[])//递归分解数组{    if(first < last)    {        int mid = (first+last)/2;        MergeInsert(arr, first, mid, temp);//左边有序        MergeInsert(arr, mid+1, last, temp);//右边有序        MergeArray(arr, first, mid, last, temp);//合并    }}void MergeSort(int arr[], int length){    int b[10];    MergeInsert(arr, 0, length-1, b);}void main(){    int arr[] = {3,2,1,5,6,7,8,9,0,4};    int i = 0;    for(i = 0; i < 10; i++)    {        printf("%d ", arr[i]);    }    printf("\n");    MergeSort(arr, 10);    for(i = 0; i < 10; i++)    {        printf("%d ", arr[i]);    }    printf("\n");}
0 0