合并排序问题

来源:互联网 发布:网页php的编程代码大全 编辑:程序博客网 时间:2024/06/06 01:27

题目:

对n个元素组成的序列进行排序。

基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个集合进行排序,最终将排序好的子集合合并成所要求的排好序的集合。

代码:

#include <bits/stdc++.h>using namespace std;void Copy(int *a,int *b,int left,int right){    for(int i=left; i<=right; i++)        a[i]=b[i];}void Merge(int *a,int *b,int left,int mid,int right){    int i=left,j=mid+1,k=left;//a[left:mid] && a[mid+1:right] --> b[left:right]    while(i<=mid&&j<=right)    {        if(a[i]<=a[j])            b[k++]=a[i++];        else            b[k++]=a[j++];    }    if(i<=mid)        for(int q=i; q<=mid; q++)            b[k++]=a[q];    else        for(int q=j; q<=right; q++)            b[k++]=a[q];}void MergeSort(int *a, int left, int right){    int i;    int b[100];    if(left<right)           //至少有2个元素    {        i=(left+right)/2;      //取中点        MergeSort(a,left,i);        MergeSort(a,i+1,right);        Merge(a,b,left,i,right);     //合并到数组b        Copy(a,b,left,right);       //复制回数组a    }}int main(){    int n;    int a[100];    while(~scanf("%d",&n))    {        for(int i=1; i<=n; i++)            scanf("%d",&a[i]);        MergeSort(a,1,n);        for(int i=1; i<=n; i++)            printf("%d ",a[i]);        printf("\n");    }    return 0;}


原创粉丝点击