归并排序
a
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的算法。
b
c
实现:(一个数组分为两个子序列)
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4.重复步骤3直到某一指针超出序列尾
5.将另一序列剩下的所有元素直接复制到合并序列尾
d
C语言
#include <stdio.h>
void Merge(int R[],int temp[], int start, int mid, int end){
int i = start, j=mid+1, k = start;
while(i!=mid+1 && j!=end+1){
if(R[i] > R[j]){
temp[k++] = R[j++];
}
else{
temp[k++] = R[i++];
}
}
while(i != mid+1)
temp[k++] = R[i++];
while(j != end+1)
temp[k++] = R[j++];
for(i=start; i<=end; i++)
R[i] = temp[i];
}
void MergeSort(int R[], int temp[], int start, int end){
int mid;
if(start < end){
mid = start + (end-start) / 2; //避免溢出int
MergeSort(R, temp, start, mid);
MergeSort(R, temp, mid+1, end);
Merge(R, temp, start, mid, end);
}
}
void main(int argc, char * argv[]{
int n[10];
printf("请输入10个数,以逗号隔开:");
scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
int i, b[10];
MergeSort(n, b, 0, 9);
for(i=0; i<=9; i++){
printf("%d ", n[i]);
}
printf("\n");
}
运行
C++
main函数
#include <iostream.h>
#include "Merge.h"
void MergeSort(int A[],int low,int high){
int mid;
if(low<high){
mid=(low+high)/2;
MergeSort(A,low,mid);
MergeSort(A,mid+1,high);
Merge(A,low,mid,high);
}
}
void main(){
int A[]={NULL,
9,4,5,2,1,7,4,6
};
const int N=sizeof(A)/sizeof(int)-1;
for(int i=1;i<=N;i++)
cout<<A[i]<<' ';
cout<<endl;
MergeSort(A,1,N);
for(i=1;i<=N;i++)
cout<<A[i]<<' ';
cout<<endl;
}
Merge函数
void Merge(int A[],int p,int q,int r){
int B[100];
int s=p,t=q+1,k=p;
while(s<=q && t<=r){
if(A[s]<=A[t])
B[k]=A[s],s++;
else
B[k]=A[t],t++;
k++;
}
if(s==q+1)
for(;t<=r;t++,k++)
B[k]=A[t];
else
for(;s<=q;s++,k++)
B[k]=A[s];
for(int i=p;i<=r;i++)
A[i]=B[i];
}
运行