技术笔试面试

归并排序-稳定且内外兼修

说归并排序稳定是因为它是一种稳定的排序方法。(快速排序和堆排序都是不稳定的排序方法)

说归并排序内外兼修是因为它在内部排序和外部排序中都需要用到。

归并,英文是Merge。归并排序,是Merge Sort。

“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。

假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌌n/2⌍个长度为2或1的有序子序列;再两两归并…如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。

2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。

归并排序的源代码:

#include
#include
#include

void merge(int *arr,int *sarr,int i,int m,int n) //将arr[i..m]和arr[m+1,n]归并为有序的sarr[i..n]
{
        int j,k,index;
        for(j=m+1,k=i;i<=m&&j<=n;k++){
                if(arr[i]<=arr[j])
                        sarr[k]=arr[i++];
                else
                        sarr[k]=arr[j++];
        }
        if(i<=m){
                for(index=i;index<=m;index++)
                        sarr[k++]=arr[index];
        }
        if(j<=n){
                for(index=j;index<=n;index++)
                        sarr[k++]=arr[index];
        }
}

void Merge_sort(int *arr,int *sarr,int s,int t) //将arr[s..t]归并排序为sarr[s..t]
{
        int m;
        int sarr2[10]={0};
        if(s==t)
                sarr[s]=arr[s];
        else{
                m=(s+t)/2; //将arr[s..t]平分为arr[s..m]和arr[m+1,t]
                Merge_sort(arr,sarr2,s,m); //递归地将SR[s..m]归并为有序的sarr2[s..m]
                Merge_sort(arr,sarr2,m+1,t); //递归地将arr[m+1..t]归并为有序的sarr2[s..t]
                merge(sarr2,sarr,s,m,t); //将sarr2[s..m]和sarr2[m+1..t]归并到sarr[s..t]
        }
}

int main(int argc,char *argv[])
{
        printf("Quick Sort:\n");
        int arr[10]={0,4,2,5,1,8,7,9};
        int sarr[10]={0};
        int arrsize=7;
        Merge_sort(arr,sarr,1,arrsize); //进行归并排序
        int i;
        printf("Sorted array: ");
        for(i=1;i<=arrsize;i++){
                printf("%d ",sarr[i]);
        }
        printf("\n");
        return 0;
}

over~

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *