算法学习之java实现归并排序

来源:互联网 发布:java二次开发前景怎样 编辑:程序博客网 时间:2024/05/16 11:47

归并排序:

思想:将带排序的数组分为两个数组,依次递归,知道分成的数组长度为有序时,然后两两数组合并。

稳定性:稳定

代码实现:

package com.scy.arithmetic;import java.util.Arrays;/* * 归并排序:思想将待排序的分成两个数组,分别进行排序,然后合并的过程 */public class MergerSort {public static void main(String[] args) {int[] a=new int[20];for (int i = 0; i < 20; i++) {a[i]=(int)(Math.random()*(100-1+1)+1);}System.out.println(Arrays.toString(a));new MergerSort().sort(a, 0, a.length-1);System.out.println(Arrays.toString(a));}//归并排序public void sort(int[] a,int start,int end){if(start<end){int middle=(start+end)/2;//将数组分为左右两个数组分别进行排序sort(a,start,middle);sort(a,middle+1,end);//将排序好的两个数组进行合并mergerSort(a, start, middle, end);}}public void mergerSort(int[] a,int start1,int end1,int end2){//临时存储两个数组排序好的值int[] temp=new int[end2-start1+1];int s1=start1;int s2=end1+1;int e1=end1;int e2=end2;//用于表述数组是否已经读完boolean flag1=true;boolean flag2=true;for (int i = 0; i < temp.length; i++) {if(flag1&&flag2){//如果第一个数组的开始值大于第二个数组的开始值,则将第二个值赋给temp数组if(a[s1]>a[s2]){temp[i]=a[s2];if(s2==e2){flag2=false;}else{s2++;}}else{temp[i]=a[s1];if(s1==e1){flag1=false;}else{s1++;}}}//第一个数组已经用完,全部用第二个数组的else if(!flag1&&flag2){temp[i]=a[s2];if(s2==e2){flag2=false;}else{s2++;}}//如果第二个数组用完,第一个数组还有时,则开始读取第一个数组else if(flag1&&!flag2){temp[i]=a[s1];if(s1==e1){flag1=false;}else{s1++;}}//如果都读取完了,则表示已经 存储完成。}//将临时值依次赋值给数组afor (int i = 0; i < temp.length; i++) {a[start1+i]=temp[i];}}}

0 0