java堆排序
一:思想
引入:如果要你实现两个有序数组的合并,你有什么思路。
大多数人的思路是引入一个新的数组,长度为前两个数组的和,然后while判断比较两个数据的大小,依次插入。
堆排序思想:堆排序也是这个思路,先把整个大数组通过递归拆分成很小的单元,再逐渐合并这些很小的单元,直到
得到我们想要的有序数组。
二:代码
public class MergeSort {
public static void main(String[] args) {
int []needSort = {5,4,15,61,81,6,64,8,515,-5,-9,-54};
mergeSort(needSort, 0, needSort.length-1);
for(int i = 0;i<needSort.length;i++){
System.err.print(needSort[i]+" ");
}
}
public static void mergeSort(int []num, int start, int end){
int mid = (start+end)/2;
if(start < end)
{
mergeSort(num, start, mid);
mergeSort(num, mid+1, end);
mergeArrray(num, start, mid, end);
}
}
public static void mergeArrray(int []num, int start, int mid, int end){
int i = start, m = mid, j = mid + 1, n = end;
int k = 0;
int []template = new int[end - start + 1];
while(i<=m && j<=n)
{
if(num[i]<= num[j]){
template[k++] = num[i++];
}
else{
template[k++] = num[j++];
}
}
while(i<=m){
template[k++] = num[i++];
}
while(j<=n){
template[k++] = num[j++];
}
for(int a = 0; a < k; a++){
num[start+a] = template[a];
}
}
}