1. 程式人生 > >歸並排序

歸並排序

bsp blog col 返回 right 算法 數據 class 排序算法

歸並排序算法是遵循分治模式:

分解:分解待排序的的N個元素的序列成有N/2元素的子序列;(在不停的分解中,最終分解成一個元素,這樣本生就是一個已排序的序列,此時進行合並)

解決:使用歸並排序遞歸地排序兩個子序列;

合並:合並兩個已排序的子序列以產生已排序的答案

/**********************************************************
函數功能:歸並排序
入口參數: int型數組,排序的左索引值,派排序的右索引   //數組的索引是數據對於數組開始的個數a[0]對應索引1。
返回值:   void   
作者  :  hx
修改日期:  2017.5.3 
*********************************************************
*/ #include<stdio.h> #define length 10 #define max 65535 void merge_sort(int *a,int left,int right); void merge(int *a,int left,int mid,int right); int main (void) { int a[length]={3,4,5,6,7,0,1,2,8,9}; int i; merge_sort(a,1,10); for (i=0;i<10;i++) { printf("%d ",a[i]); } printf(
"\n"); return 0; } void merge(int *a,int left,int mid,int right) { int n1,n2; int i,j; n1=mid-left+1; n2=right-mid; int L[10],R[10]; for( i=0;i<n1;i++) { L[i]=a[left+i-1]; } for ( j=0;j<n2;j++) { R[j]=a[mid+j]; } L[i]=max; R[j]
=max; i=j=0; for(int k=left;k<right;k++) { if (L[i]<=R[j]) a[k-1]=L[i++]; else a[k-1]=R[j++]; } } void merge_sort(int *a,int left,int right) { int mid; if(left<right){ mid=(left+right)/2; merge_sort(a,left,mid); merge_sort(a,mid+1,right); merge(a,left,mid,right); } }

歸並排序