您的位置:首页 > 编程语言 > Java开发

分治:合并排序的java程序实现

2015-08-31 15:16 633 查看
合并排序:
采用分治策略将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合。
其算法是复杂度T(n)=O(nlogn)

合并排序主要中主要是在merge()这个方法中进行了排序。mergesort()仅仅是对数组进行的划分。

import java.util.Arrays;
import java.util.Scanner;

public class MergeSort {

/**
* 合并排序
* 分治策略
* 将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合
* 复杂度T(n)=O(nlogn)
*/
public static void mergesort(int[] a, int left, int right) {

// int b[]=new int[right-left+1];
int i = (left + right) / 2;
if (left < right) {

mergesort(a, left, i);// 左边排序

mergesort(a, i + 1, right);// 右边排序

merge(a, left, i, right); // 合并排序并赋给原来的数组a
// copy(a,left,right);

}
}

public static void merge(int a[], int left, int i, int right) {
int k = 0;
int m = i + 1; // 右指针
int n = left; // 左指针
int b[] = new int[right - left + 1];

while (n <= i && right >= m) {
if (a
< a[m]) {
b[k++] = a[n++];

} else {
b[k++] = a[m++];

}
}

while (n <= i) { // 把左边数组剩余的数值放入数组b中
b[k++] = a[n++];

}
while (m <= right) { // 把右边数组剩余的数值放入数组b中
b[k++] = a[m++];

}

for (int j = 0; j < b.length; j++) { // 把b中的数组存入a中
a[j + left] = b[j]; // 这里的left值不是n的值

}
/*
* void copy(int a[],int b[],int left,int right){ int j=0;
* for(j=0;j<right-left+1;j++){ a[j+left]=b[j]; }
*/
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);

System.out.print("输入数组的长度:");
int n = in.nextInt();
int a[] = new int
;
for (int i = 0; i < n; i++) {
System.out.print("输入第" + (i + 1) + "个数");
a[i] = in.nextInt();
}

// MergeSort ms=new MergeSort();
// ms.mergesort(a, 0, a.length-1);
MergeSort.mergesort(a, 0, n-1);
System.out.println("排序结果是:");
System.out.println(Arrays.toString(a)); //输出数组a

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息