排序算法:归并排序

来源:互联网 发布:js checkbox按钮 编辑:程序博客网 时间:2024/05/25 16:40

归并排序:步骤一、对序列按照坐标中间值划分为左半部分和有半部分(这点和快速排序不同,归并排序按照坐标选择,与元素本身无关),对两边分别重复此操作,知道每个细分的小序列长度为1。

步骤二、将细分的已经有序的序列合并。

简单来说就是一个递归加合并的操作,跟线段树非常相似(完全一模一样有木有?)。

相对于快速排序来说,实现起来倒是很方便。

#include<stdio.h>#include<string.h>#define N 1005void merge_sort(int a[],int l,int r,int b[]){if(l>=r) return ;int mid=(l+r)/2;/**********************//*递归,对序列的左右两边分别排序*/merge_sort(a,l,mid,b);merge_sort(a,mid+1,r,b);/*********************//*********************//*回溯,将序列的左右两个部分合并起来*/int s1=l,s2=mid+1;int k=l;while(s1<=mid&&s2<=r){if(a[s1]>a[s2]) b[k++]=a[s2++];else b[k++]=a[s1++];}while(s1<=mid)b[k++]=a[s1++];while(s2<=r)b[k++]=a[s2++];/********************//*将有序的序列重新复制给原序列*/int i;for(i=l;i<=r;i++) a[i]=b[i];return ;}int main(){int n;int a[N],b[N];while(scanf("%d",&n)!=EOF){int i;for(i=0;i<n;i++) scanf("%d",&a[i]);merge_sort(a,0,n-1,b);//调用排序函数for(i=0;i<n;i++) printf("%d ",a[i]);printf("\n");}return 0;}


0 0
原创粉丝点击