排序算法之—二路归并排序
//归并排序: #include<stdio.h> #include<stdlib.h> /*先写将两个有序表合并为一个有序表的算法merge() 设两个有序表放在同一个数组中相邻的位置上R[lwo...mid],R[mid+1...high] 先将他们合并到一个暂时的数组R1中,待合并完成后复制回R中。 每次从两个段中取出一个关键字比较,较小的放入R1,若哪一段有剩余,则直接复制进R1 再复制回R */ void Merge(int R[],int low,int mid,int high)//归并两个有序数组 { int *R1;//变长临时数组 int i=low ,j=mid+1, k=0;//k是R1的下标,i,j是两段的下标 R1=(int*)malloc((high-low+1)*sizeof(int));//动态分配空间 while(i<=mid &&j<=high)//两段都没有扫描完时执行循环 { if(R[i] <= R[j])//若第一段的小则将第一段的元素放到R1中 { R1[k]=R[i]; i++; k++; } else { R1[k]=R[j]; j++; k++; } } while(i<=mid)//第一段没有扫描完 { R1[k]=R[i];//第1段剩下的复制到R1 i++;k++; } while(j<=high)//第2段没有扫描完 { R1[k]=R[j];//第二段剩下的复制到R1 j++;k++; } for(k=0,i=low;i<=high;k++,i++)//把R1复制到R中去 { R[i]=R1[k]; } free(R1); } void MergeSortDC(int R[],int low,int high)//对R【low。。high】进行递归归并排序 { int mid; if(low<high) { mid=(low+high)/2; MergeSortDC(R,low,mid); MergeSortDC(R,mid+1,high); Merge(R,low,mid,high); } } void Mergesot1(int R[],int n)//传一个数组R,有n个元素,便于调用 { MergeSortDC(R,0,n-1); } void disp(int R[],int n) { int i=0; for( i=0;i<n;i++) { printf("%d ",R[i]); } printf("\n\n"); } int main() { int R[6]={1,9,3,0,2,5}; Mergesot1(R,6); disp(R,6); }
0 条评论