归并排序
最近因为要开始找工作了,看了看数据结构的基础算法—归并排序,它的思想很简单,但是你自己手敲代码的时候,感觉那个合并时候的索引值好乱,看得我头皮发麻,因此特意做了笔记。
public class margeSortTest {
static int number=0;
public static void main(String[] args) {
int[] a = {26, 5, 98, 108, 28, 99, 100, 56 ,75,1,76743};
MergeSort(a);
System.out.println("********************");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
private static void MergeSort(int[] a) {
sort(a,0,a.length-1);
}
private static void sort(int a[],int startIndex,int endIndex) {
if(startIndex>=endIndex)
return;
//中间值
int midIndex = (startIndex+endIndex)/2;
sort(a, startIndex, midIndex);
sort(a, midIndex+1, endIndex);
//合并
merge(a,startIndex,endIndex,midIndex);
}
private static void merge(int[] a, int startIndex, int endIndex, int midIndex) {
int mergeArr[] =new int[a.length];
//新数组的mergeArr索引--用于保存到改数组时存放的索引。
int itemIndex = startIndex;
//右侧开始的索引
int rightSIndex = midIndex+1;
//这里存放一个左侧的开始的索引值---用于后面的--将mergeArr 赋值给a数组
int leftIndex = startIndex;
//不越界的情况就合并
while(startIndex <=midIndex && rightSIndex <= endIndex){
//右边的数字大
if(a[startIndex]>a[rightSIndex]){
mergeArr[itemIndex++] = a[rightSIndex++];
}
//左边的数字比较大
else{
mergeArr[itemIndex++] = a[startIndex++];
}
}
//越界的情况,需要将左边剩余的值放入数组
while(startIndex<=midIndex){
mergeArr[itemIndex++] = a[startIndex++];
}
//越界的情况,需要将右边剩余的值放入数组
while(rightSIndex<=endIndex){
mergeArr[itemIndex++] = a[rightSIndex++];
}
//用mergeArr更新a数组。
for (int i = leftIndex; i <= endIndex; i++) {
a[i] = mergeArr[i];
}
}