Last active
August 29, 2015 14:04
-
-
Save kaka2008/b93285dda5145a556073 to your computer and use it in GitHub Desktop.
用java实现的合并排序
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package first; | |
/** | |
* 合并排序,时间代价为O(n),总的计算次数是一定的,每次比较花得时间是个常量<br/> | |
* 但是前提是左右两个数组是排好序的 | |
* | |
* @author weizhankui | |
* @date 2014-7-27 | |
* | |
*/ | |
public class Sort { | |
/* | |
* 合并排序(降序) | |
* | |
* a是数组 p,q,r是下标,企业满足p<=q<r 假设a[p..q]和a[q+1..r]都是排好序的 | |
*/ | |
public static void merge_desc(int[] a, int p, int q, int r) { | |
int n1 = q - p + 1; | |
int n2 = r - q; | |
int[] left = new int[n1]; | |
int[] right = new int[n2]; | |
for (int i = 0; i < n1; i++) { | |
left[i] = a[p + i]; | |
} | |
for (int j = 0; j < n2; j++) { | |
right[j] = a[q + j + 1]; | |
} | |
int i = 0; | |
int j = 0; | |
for (int k = p; k <= r; k++) { | |
if (i == n1) { | |
a[k] = right[j]; | |
j++; | |
} else if (j == n2) { | |
a[k] = left[i]; | |
i++; | |
} else { | |
if (left[i] >= right[j]) { | |
a[k] = left[i]; | |
i++; | |
} else { | |
a[k] = right[j]; | |
j++; | |
} | |
} | |
} | |
printArray(a); | |
} | |
/* | |
* 合并排序(升序) | |
* | |
* a是数组 p,q,r是下标,企业满足p<=q<r 假设a[p..q]和a[q+1..r]都是排好序的 | |
*/ | |
public static void merge_asc(int[] a, int p, int q, int r) { | |
int n1 = q - p + 1; | |
int n2 = r - q; | |
int[] left = new int[n1]; | |
int[] right = new int[n2]; | |
for (int i = 0; i < n1; i++) { | |
left[i] = a[p + i]; | |
} | |
for (int j = 0; j < n2; j++) { | |
right[j] = a[q + j + 1]; | |
} | |
int i = 0; | |
int j = 0; | |
for (int k = p; k <= r; k++) { | |
if (i == n1) { | |
a[k] = right[j]; | |
j++; | |
} else if (j == n2) { | |
a[k] = left[i]; | |
i++; | |
} else { | |
if (left[i] <= right[j]) { | |
a[k] = left[i]; | |
i++; | |
} else { | |
a[k] = right[j]; | |
j++; | |
} | |
} | |
} | |
printArray(a); | |
} | |
public static void main(String[] args) { | |
int[] a = { 9, 5, 1, 8, 7, 6, 4, 3, 2 }; | |
System.out.println("降序排列前:"); | |
printArray(a); | |
System.out.println("降序排列后:"); | |
merge_desc(a, 0, 2, 8); | |
a = new int[] { 1, 5, 6, 9, 2, 3, 4, 6, 7, 8 }; | |
System.out.println("升序排列前:"); | |
printArray(a); | |
System.out.println("升序排列后:"); | |
merge_asc(a, 0, 3, 8); | |
} | |
public static void printArray(int[] a) { | |
for (int num : a) { | |
System.out.print(num + ","); | |
} | |
System.out.println(""); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
为什么看不到代码样式?