今天看看归并排序算法吧,归并排序与快速排序类似,都是采用分治思想,今天因为一个小错误,调了一个多小时,惭愧。
题目:将指定数组按从小到大顺序排列。
思路:归并是将有序的两个序列合并的过程,例如将序列135和序列246合并成序列123456。根据这个思想,我们将给定的数组划分成多个小序列,对小序列进行排序,再将这些序列合并。一个简单的做法是第一步将数组中相邻的两个数字作为一组,对这两个数字排序,例如对序列47651328划分为47,65,13,28排序后为47,56,13,28,然后将47和65归并得到4567,1328归并得到1238,最后将4567和1328归并得到12345678。
代码:递归算法不容易理解,参数值需要注意,我在写代码的时候,把merge方法中的start和startIndex弄混了,导致调试了一个多小时,惭愧。
public class MergeSort {
public static int temp[] = new int[8];
public static void merge(int a[], int start, int end) {
int mid = (end + start) / 2;
int midIndex = mid;
int startIndex = start;
int tempIndex = start;
while (start <= midIndex && mid + 1 <= end) {
if (a[start] < a[mid + 1]) {
temp[tempIndex] = a[start];
start++;
} else {
temp[tempIndex] = a[mid + 1];
mid++;
}
//System.out.print(temp[tempIndex]);
tempIndex++;
}
if (start <= midIndex) {
for (int i = start; i <= midIndex; i++) {
temp[tempIndex] = a[i];
tempIndex++;
}
}
if (mid + 1 <= end) {
for (int i = mid + 1; i <= end; i++) {
temp[tempIndex] = a[i];
tempIndex++;
}
}
for (int i = startIndex; i <= end; i++) {
a[i] = temp[i];
}
}
public static void mergeSort(int a[], int start, int end) {
if (start < end) {
int mid = (end + start) / 2;
mergeSort(a, start, mid);
mergeSort(a, mid + 1, end);
merge(a, start, end);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = { 4, 7, 6, 5, 1, 3, 2, 8 };
mergeSort(a, 0, a.length-1);
System.out.print("排序结果:");
for (int i = 0; i <a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
排序结果:1 2 3 4 5 6 7 8