分治:合并排序的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
}
}
采用分治策略将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合。
其算法是复杂度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
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统