场景:代码实现堆排序,选择使用Java代码
思路:把待排数组平均分成两组,递归分组,直到每一组剩下一个元素后,两两数组进行有序合并。
代码实现
package Sort;
/**
* @author yummy
*/
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MergeSort test = new MergeSort();
int []a = {1,7,2,8,3,6,5,4,7,0,12,4};
System.out.print("排序前:");
for(int i = 0; i < a.length; i++)
System.out.print(a[i]+" ");
System.out.println(" ");
mergeSort(a,0,a.length-1);
System.out.print("排序后:");
for(int i = 0; i < a.length; i++)
System.out.print(a[i]+" ");
System.out.println(" ");
}
/**
*
* @param array 待排数组
* @param start
* @param end
*/
public static void mergeSort(int[] array,int start,int end){
if(start >= end)
return;
int mid = (start+end)/2;
mergeSort(array,start,mid);
mergeSort(array,mid+1,end);
merge(array,start,mid,end);
}
/**
* 合并操作
* @param array
* @param left
* @param center
* @param right
*/
public static void merge(int[] array,int start,int center,int end){
//临时数组
int[] temp = new int[end-start+1];
//第二个数组头元素引索
int secondArr = center+1;
//临时数组头元素引索
int tempArr = 0;
//记录下start位置
int flag = start;
while(start <= center && secondArr <= end)
{
if(array[start] <= array[secondArr])
temp[tempArr++] = array[start++];
else
temp[tempArr++] = array[secondArr++];
}
while(start <= center)
{
temp[tempArr++] = array[start++];
}
while(secondArr <= end)
{
temp[tempArr++] = array[secondArr++];
}
tempArr = 0;
while(flag <= end)
{
array[flag++] = temp[tempArr++];
}
temp = null;
}
}