经典排序算法——归并排序
2013-06-08 15:01
281 查看
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
链接:http://blog.csdn.net/morewindows/article/details/6678165
public class Sort {
static final int MAX = 20;
public static void main(String[] args) {
int[] data = new int[MAX];
Random random = new Random();
// 生成一个随机数组
for (int i = 0; i < MAX; i++) {
data[i] = random.nextInt(MAX * MAX);
}
// 打印排序前数据内容
System.out.println(Arrays.toString(data));
// 归并排序
mergsort(data, 0, MAX-1);
// 打印排序后的数组
System.out.println(Arrays.toString(data));
}
static void mergsort(int[] data, int first, int last) {
if (first < last) {
int mid = (first + last) / 2;
mergsort(data, first, mid); // 归并数组的前一半
mergsort(data, mid + 1, last); // 归并数组后一般
mergearray(data, first, mid, last); // 归并数组
}
}
static void mergearray(int[] data, int first, int mid, int last) {
int i = first;
int j = mid + 1;
int m = mid;
int n = last;
int k = 0;
int[] temp = new int[data.length];
while (i <= m && j <= n) {
// 依次比较,选取最小的放入临时数组汇总
if (data[i] <= data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
}
// 如果还有没有比较的,则放在数组后面插入
while (i <= m) {
temp[k++] = data[i++];
}
// 如果还有没有比较的,则放在数组后面插入
while (j <= n) {
temp[k++] = data[j++];
}
// 复制到原始的数组中
for (i = 0; i < k; i++) {
data[first + i] = temp[i];
}
}
}
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
链接:http://blog.csdn.net/morewindows/article/details/6678165
public class Sort {
static final int MAX = 20;
public static void main(String[] args) {
int[] data = new int[MAX];
Random random = new Random();
// 生成一个随机数组
for (int i = 0; i < MAX; i++) {
data[i] = random.nextInt(MAX * MAX);
}
// 打印排序前数据内容
System.out.println(Arrays.toString(data));
// 归并排序
mergsort(data, 0, MAX-1);
// 打印排序后的数组
System.out.println(Arrays.toString(data));
}
static void mergsort(int[] data, int first, int last) {
if (first < last) {
int mid = (first + last) / 2;
mergsort(data, first, mid); // 归并数组的前一半
mergsort(data, mid + 1, last); // 归并数组后一般
mergearray(data, first, mid, last); // 归并数组
}
}
static void mergearray(int[] data, int first, int mid, int last) {
int i = first;
int j = mid + 1;
int m = mid;
int n = last;
int k = 0;
int[] temp = new int[data.length];
while (i <= m && j <= n) {
// 依次比较,选取最小的放入临时数组汇总
if (data[i] <= data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
}
// 如果还有没有比较的,则放在数组后面插入
while (i <= m) {
temp[k++] = data[i++];
}
// 如果还有没有比较的,则放在数组后面插入
while (j <= n) {
temp[k++] = data[j++];
}
// 复制到原始的数组中
for (i = 0; i < k; i++) {
data[first + i] = temp[i];
}
}
}
相关文章推荐
- 经典排序算法--插入排序 希尔排序 归并排序
- 经典的排序算法--归并排序
- 漫谈经典排序算法:四、归并排序(合并排序)
- Java(.NET)经典排序算法之归并排序
- 经典排序算法之归并排序
- 经典排序算法 -----冒泡排序,插入排序,快速排序,归并排序,堆排序
- 漫谈经典排序算法:四、归并排序(合并排序)
- Python实现经典内部排序算法(归并排序)
- 经典排序算法:归并排序(python)
- 经典排序算法学习笔记六——归并排序
- 排序算法_归并排序
- 经典排序算法 - 鸡尾酒排序Cocktail sort
- 排序算法(python)-归并排序
- 【转载】C#实现所有经典排序算法
- 排序算法1——归并排序
- 常见排序算法导读(9)[归并排序]
- 十大经典排序算法-JS篇
- 算法基础_8大经典排序算法实现回顾
- 用JavaScript实现十大经典排序算法
- 经典排序算法学习笔记七——堆排序