归并排序
归并排序就是把两组有序的数组,合并成一个有序的数组。至于如何分成两个有序的数组,递归的方法就是,把一个未排序的数组,一直对半分,直到分成两个数组长度为1,然后一层一层合并上去。非递归的方法就是,在同一个数组,从合并相邻两个长度为1的数据开始,合并到数组的结尾,这样算一轮,一轮完成以后,长度翻倍,合并两个相邻长度为2的数据组。这样一轮一轮合并上去,也完成了归并排序
时间复杂度:nlogn
(递归版)
package demo10;
import java.util.Scanner;
public class test1 {
static int[] A = {5 , 2, 4, 1, 3, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14};
public static void main(String[] args) {
sort(A, 0, 14);
for (int i = 0; i < A.length; i++)
System.out.println(A[i]);
}
private static void sort(int[] B, int low, int high) {
int mid = (low + high) / 2;
if (low < high)
{
sort(B, low, mid); //将数组分成两半
sort(B, mid + 1, high);
merge(B, low, mid, high); //合并两个数组
}
}
private static void merge(int[] b, int low, int mid, int high) { //合并两个有序序列
int[] temp = new int[high - low + 1]; //创建一个临时数组,用来存储low-high的有序序列
int i = low;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= high) //遍历,存储
{
if (b[i] < b[j])
temp[k++] = b[i++];
else
temp[k++] = b[j++];
}
while (i <= mid) //把剩余的即最大部分依次放入数组
temp[k++] = b[i++];
while (j <= high) //把剩余的即最大部分依次放入数组
temp[k++] = b[j++];
k = 0;
for (i = low; i <= high; i++)
b[i] = temp[k++];
}
}
(非递归版)
package demo10;
import java.util.Scanner;
public class test1 {
static int[] A = {5 , 2, 4, 1, 3, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14};
static int N = A.length;
public static void main(String[] args) {
int j = 1; //每次合并的两个子序列的长度
while (j < N) {
int i = 0;
while (i + j - 1 < N - 1) { //此while作用就是依次合并两个相邻j长的序列
int temp;
if (i + 2 * j - 1 < N - 1)
temp = i + 2 * j - 1;
else
temp = N - 1;
merge(A, i, i + j - 1, temp);
i += (2 * j); // 合并下一对j长的序列
}
j *= 2; // 合并了一轮以后 子序列的长度 翻倍 继续合并
}
for (int i = 0; i < A.length; i++)
System.out.println(A[i]);
}
private static void merge(int[] b, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= high)
{
if (b[i] < b[j])
temp[k++] = b[i++];
else
temp[k++] = b[j++];
}
while (i <= mid)
temp[k++] = b[i++];
while (j <= high)
temp[k++] = b[j++];
k = 0;
for (i = low; i <= high; i++)
b[i] = temp[k++];
}
}