归并排序
二路归并排序
//二路归并排序
//分治法
//自底向上的二路归并排序算法
#include<stdio.h>
#include<malloc.h>
void disp(int a[],int n){
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void Merge(int a[],int low,int mid,int high){
//将a[low..mid]和a[mid+1..high]两个相邻的有序子序列归并为一个有序子序列a[low..high]
int *tmp;
int i = low,j = mid+1,k = 0;
tmp = (int *)malloc((high - low + 1)*sizeof(int));
while(i < mid && j < high){
if(a[i] <= a[j]){
tmp[k] = a[i];
i++;
k++;
}
else{
tmp[k] = a[j];
j++;
k++;
}
}
while(i <= mid){
tmp[k] = a[i];
i++;
k++;
}
while(j <= high){
tmp[k] = a[j];
j++;
k++;
}
for(k = 0,i = low;i<=high;k++,i++)
a[i] = tmp[k];
free(tmp);
}
void MergePass(int a[],int length,int n){ //进行一趟二路归并排序
int i;
for(i=0;i+2*length-1 < n;i = i+2*length)
Merge(a,i,i+length-1,i+2*length-1);
if(i+length-1 < n)
Merge(a,i,i+length-1,n-1);
}
void MergeSort(int a[],int n){
int i;
for(int i = 1;i<n;i = 2*i)
MergePass(a,i,n);
}
int main(){
int n = 10;
int a[] = {2,5,1,7,10,6,9,4,3,8};
printf("排序前:");
disp(a,n);
MergeSort(a,n); //二路归并算法
printf("排序后:");
disp(a,n);
return 0;
}
三路归并排序
//三路归并排序
void merge3(int a[],int l,int s1,int s2,int r){
int i,j,k,h,*ta;
i = l;
j = s1+1;
h = 0;
ta = (int *)malloc((r-l+1)*sizeof(int));
while(i<=s1 && j<=s2){ //将a[l..s1]和a[s1+1..s2]合并排序
if(a[i] <= a[j])
ta[h++] = a[i++];
else
ta[h++] = a[j++];
}
while(i <= s1)
ta[h++] = a[i++];
while(j <= s2)
ta[h++] = a[j++];
//将前两段的合并结果再和第三段合并
for(k = 0;k < h;k++)
a[l+k] = ta[k];
i = l;
j = s2+1;
h = 0;
while(i<=s2 && j<= r){
if(a[i] <= a[j])
ta[h++] = a[i++];
else
ta[h++] = a[j++];
}
while(i <= s2)
ta[h++] = a[i++];
while(j <= r)
ta[h++] = a[j++];
for(k = 0;k < h;k++)
a[l+k] = ta[k];
free(ta);
}
浙公网安备 33010602011771号