import java.util.Vector;
public class MergeSort2_3_2
{
/**
* 不使用哨兵的归并排序
* @date 2015-6-13
* @author lemma
*/
// doSort方法
public void doSort(Vector<Integer> Data, int start, int end)
{
// 递归调用doSort
if (start < end)
{
int middle = (start + end) / 2;
// 对数组前半部分进行归并排序
doSort(Data, start, middle);
// 对数组后半部分进行归并排序
doSort(Data, middle + 1, end);
// 分解数组
Vector<Integer> SerpData1 = new Vector<Integer>();
Vector<Integer> SerpData2 = new Vector<Integer>();
// 从start至middle
for (int index = start; index <= middle; index++)
SerpData1.add(Data.get(index));
// 从middle+1至end
for (int index = middle + 1; index <= end; index++)
SerpData2.add(Data.get(index));
// 合并数组,并在原数组中排序
for (int index1 = 0, index2 = 0, indexAll = start; indexAll <= end; indexAll++)
{
//第一个数组已经全部插入原数组
if (index1 > middle - start)
{
Data.set(indexAll, SerpData2.get(index2));
index2++;
}
//第二个数组已经全部插入原数组
else if (index2 > end - middle - 1)
{
Data.set(indexAll, SerpData1.get(index1));
index1++;
}
//第一个数组元素小于第二个数组元素
else if (SerpData1.get(index1) <= SerpData2.get(index2))
{
Data.set(indexAll, SerpData1.get(index1));
index1++;
}
//第二个数组元素小于第一个数组元素
else
{
Data.set(indexAll, SerpData2.get(index2));
index2++;
}
}
}
}
public static void main(String args[])
{
int OriData[] = { 15, 68, 48, 65, 12, 47, 5, 61, };
Vector<Integer> Data = new Vector<Integer>();
for (int index = 0; index < OriData.length; index++)
{
Data.add(OriData[index]);
}
new MergeSort2_3_2().doSort(Data, 0, Data.size() - 1);
for (int v : Data)
{
System.out.print(v + " ");
}
}
}