最近打算把算法捋一捋,这次是分治法的典型例子:合并排序。需要的朋友请自取哦!欢迎大家和我一起交流~~
1.合并排序算法思想:
将待排序的有n个元素的序列分割成两个规模大小相同的子数组,如果子数组规模到达容易求出排序时停止分割,否则继续分割。直到容易求出排序也就是子数组只有单元素时,我们把它视为容易解决排序的问题规模,我们认为这个具有单元素的子数组已经排好序,然后将两两相邻的子数组合并成所要求的序列,直到不再存在未合并的子数组,算法终止。
步骤:
先将待排序列分割成子数组;
当子数组只有单个元素时停止分割;
将这些子数组两两合并。
2.代码如下:
‘’’
//分治法_合并排序;
public class MergeSort {
public static void MergeSort1(Comparable a[],int left,int right){
Comparable []b =new Comparable[right+1];
if(left<right) {//至少俩元素
int i=(left+right)/2;//取中点
MergeSort1(a,left,i);//处理左半段
MergeSort1(a,i+1,right);//处理右半段
Merge(a,b,left,i,right);//将两段序列合并成有序结果
Copy(a,b,left,right);//复制
}
}
//合并排序,把两段待排序序列合并成有序结果
static void Merge(Comparable [ ] c, Comparable d[ ] ,int l, int m , int r) {
int i=l;//第一段的游标(起始位置)
int j=m+1;//第二段的游标(起始位置)
int k=l;//结果的游标
//只要段里面存在i和j,不断进行归并
while((i<=m)&&(j<=r)) {
if(c[i].compareTo(c[j])<=0)
d[k++]=c[i++];
else d[k++]=c[j++];
}
//把余下部分加入到数组中
if(i>m) {
for(int q=j;q<=r;q++)
d[k++]=c[q];
}
else {
for(int q=i;q<=m;q++)
d[k++]=c[q];
}
}
//复制数组
static void Copy(Comparable[] a, Comparable[] b, int left, int right) {
for(int i=left;i<=right;i++) {
a[i]=b[i];
}
}
public static void main(String[] args) {
Comparable[] a= {23,5,9,16,30,25,17,18};
MergeSort1(a,0,7);
System.out.println("合并排序后结果:");
for(int i=0;i<=7;i++) {
System.out.print(a[i]+" ");
}
}
}
‘’’