经典排序之归并排序
来源:互联网 发布:movist for mac 1.4.2 编辑:程序博客网 时间:2024/05/22 08:14
package 归并排序;
/*
* 归并排序的思想:将数组从中间分开,然后利用递归的方法将左右子序列均拆开
* 再借助一个数组归并左右序列,排序是在归并时进行的,最后将数据复制到原始数组中
*/
public class mergeSort {
//要排序的数组
private static int[] array = { 12,34,2543,54324,764,43,247,464,34};
public static void main(String[] args) {
//先判断一下是否需要用到归并数组,如果数目较少,比如只有5个时,使用选择排序等方法
if(array.length<5){
selectSort(array);
//查看结果
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+", ");
}
return;
}
//数组中与元素较多时使用归并排序
mergesort(array, 0, array.length - 1);
//打印结果
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+", ");
}
System.out.println();
}
//具体的归并排序方法
public static void mergesort(int[] a, int first, int last) {
System.out.println("归并排序。。。");
int mid;
int[] b = new int[last-first+1]; //需要借助的临时数组
if (first >= last){
return;
}
else {
mid = (first + last) / 2;
mergesort(a, first, mid); // 递归的思想
mergesort(a, mid + 1, last);
//将左右子序列归并到一起,利用那个临时数组
int beginHalf1 = first;
int endHalf1 = mid;
int beginHalf2 = mid + 1;
int endHalf2 = last;
int index = 0;
for (; beginHalf1 <= endHalf1 && beginHalf2 <= endHalf2; index++) {
if (a[beginHalf1] <= a[beginHalf2]) {
b[index] = a[beginHalf1];
beginHalf1++;
} else {
b[index] = a[beginHalf2];
beginHalf2++;
}
}
// 一个子数组已经全部复制到临时数组中了,然后将另一数组中剩下的元素复制到临时数组中
while (beginHalf1 <= endHalf1) {
b[index++] = a[beginHalf1++];
}
while (beginHalf2 <= endHalf2) {
b[index++] = a[beginHalf2++];
}
//复制回去
for(int z=0;z<b.length;z++){
a[first+z]=b[z]; //最容易出错的地方
}
}//end else
}
//选择排序
public static void selectSort(int[]a){
System.out.println("选择排序。。。");
for(int i = 0; i < a.length; i++){
int index = selectMinIndexOfArray(a,i);
swap(a,index,i);
}
}
public static int selectMinIndexOfArray(int[]a,int i){
int min = a[i];
int minIndex = i;
for(int j = i; j < a.length; j++){
if(a[j]<min){
min = a[j];
minIndex = j;
}
}
return minIndex;
}
public static void swap(int[]a,int i,int j){
int item;
item = a[i];
a[i] = a[j];
a[j] = item;
}
}
/*
* 归并排序的思想:将数组从中间分开,然后利用递归的方法将左右子序列均拆开
* 再借助一个数组归并左右序列,排序是在归并时进行的,最后将数据复制到原始数组中
*/
public class mergeSort {
//要排序的数组
private static int[] array = { 12,34,2543,54324,764,43,247,464,34};
public static void main(String[] args) {
//先判断一下是否需要用到归并数组,如果数目较少,比如只有5个时,使用选择排序等方法
if(array.length<5){
selectSort(array);
//查看结果
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+", ");
}
return;
}
//数组中与元素较多时使用归并排序
mergesort(array, 0, array.length - 1);
//打印结果
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+", ");
}
System.out.println();
}
//具体的归并排序方法
public static void mergesort(int[] a, int first, int last) {
System.out.println("归并排序。。。");
int mid;
int[] b = new int[last-first+1]; //需要借助的临时数组
if (first >= last){
return;
}
else {
mid = (first + last) / 2;
mergesort(a, first, mid); // 递归的思想
mergesort(a, mid + 1, last);
//将左右子序列归并到一起,利用那个临时数组
int beginHalf1 = first;
int endHalf1 = mid;
int beginHalf2 = mid + 1;
int endHalf2 = last;
int index = 0;
for (; beginHalf1 <= endHalf1 && beginHalf2 <= endHalf2; index++) {
if (a[beginHalf1] <= a[beginHalf2]) {
b[index] = a[beginHalf1];
beginHalf1++;
} else {
b[index] = a[beginHalf2];
beginHalf2++;
}
}
// 一个子数组已经全部复制到临时数组中了,然后将另一数组中剩下的元素复制到临时数组中
while (beginHalf1 <= endHalf1) {
b[index++] = a[beginHalf1++];
}
while (beginHalf2 <= endHalf2) {
b[index++] = a[beginHalf2++];
}
//复制回去
for(int z=0;z<b.length;z++){
a[first+z]=b[z]; //最容易出错的地方
}
}//end else
}
//选择排序
public static void selectSort(int[]a){
System.out.println("选择排序。。。");
for(int i = 0; i < a.length; i++){
int index = selectMinIndexOfArray(a,i);
swap(a,index,i);
}
}
public static int selectMinIndexOfArray(int[]a,int i){
int min = a[i];
int minIndex = i;
for(int j = i; j < a.length; j++){
if(a[j]<min){
min = a[j];
minIndex = j;
}
}
return minIndex;
}
public static void swap(int[]a,int i,int j){
int item;
item = a[i];
a[i] = a[j];
a[j] = item;
}
}
- 经典排序 之 归并
- 经典排序之归并排序
- 经典排序之归并排序
- 经典排序之归并排序
- 经典算法之归并排序
- 经典排序算法之归并排序
- 经典排序算法之归并排序
- 经典算法学习:排序之归并排序
- 经典排序算法之:归并排序
- 经典排序算法之归并排序
- 经典白话算法之归并排序
- 经典算法整理之归并排序
- 经典算法之二:归并排序
- 经典算法之二路归并排序
- 【经典排序算法】归并排序
- 经典算法--归并排序
- 排序之归并排序
- 排序之归并排序
- PDF电子书制作详细教程
- 安装标识
- 经典算法之选择排序
- 经典排序之插入排序
- 【JTharness4_4_0】【7.如何让harness执行自定义格式的脚本】
- 经典排序之归并排序
- 经典排序之快速排序
- 我的C/C++之路(001课)
- MySQL在Centos的卸载和安装
- 腾讯2012实习生招聘面试题(部分)
- 【JTharness4_4_0】【8.如何定义自己的Test Scripts】
- hdu 1060
- 【ZOJ坑爹的题意和数据】浙大 zoj 4706 Draw Something Cheat
- 黑马程序员-关于结构