归并排序
import java.util.Arrays;
public class Merge {
public static void main(String[] args) {
int[] a = {9,8,7,6,5,4,3,2,1,0};
new Merge().sort(a,10);
System.out.println(Arrays.toString(a));
}
public void sort(int[] a, int n) {
mergesort(a,0, n-1);
}
public void mergesort(int[] a, int left, int right){
if(left>=right)
return;
int mid = (right+left)/2;
mergesort(a, left, mid);
mergesort(a, mid+1, right);
merge(a, left, mid, right);
}
//将a[left,mid] 和 a[mid+1, right]合并为a[left, right]
public void merge(int[] a, int left, int mid, int right){
int i = left;
int j = mid+1;
int t = 0;
int[] temp = new int[right-left+1];
while (i<=mid && j<=right){
if(a[i]<=a[j]){
temp[t++] = a[i++];
}else {
temp[t++] = a[j++];
}
}
//判断哪个子数组还有元素
int start = i;
int end = mid;
if(j<=right){
start = j;
end = right;
}
while(start <= end){
temp[t++] = a[start++];
}
//将temp数组拷回a[left,right]
//if (right - left + 1 >= 0) System.arraycopy(temp, 0, a, left + 0, right - left + 1);
for (int k = 0; k <= right-left; k++) {
a[left+k] = temp[k];
}
}
}
堆排序
/**
* 堆排序
*/
public class HeapSort {
/**
* 排序
* 堆元素是从数组下标0开始
* @param arr
*/
public static void sort(int[] arr) {
if (arr.length <= 1) {
return;
}
// 1、建堆
buildHeap(arr);
// 2、排序
int k = arr.length - 1;
while (k > 0) {
// 将堆顶元素(最大)与最后一个元素交换位置
swap(arr, 0, k);
// 将剩下元素重新堆化,堆顶元素变成最大元素
heapify(arr, --k, 0);
}
}
/**
* 建堆
*
* @param arr
*/
private static void buildHeap(int[] arr) {
// (arr.length - 1) / 2 为最后一个叶子节点的父节点
// 也就是最后一个非叶子节点,依次堆化直到根节点
for (int i = (arr.length - 1) / 2; i >= 0; i--) {
heapify(arr, arr.length - 1, i);
}
}
/**
* 堆化
*
* @param arr 要堆化的数组
* @param n 最后堆元素下标
* @param i 要堆化的元素下标
*/
private static void heapify(int[] arr, int n, int i) {
while (true) {
// 最大值位置
int maxPos = i;
// 与左子节点(i * 2 + 1)比较,获取最大值位置
if (i * 2 + 1 <= n && arr[i] < arr[i * 2 + 1]) {
maxPos = i * 2 + 1;
}
// 最大值与右子节点(i * 2 + 2)比较,获取最大值位置
if (i * 2 + 2 <= n && arr[maxPos] < arr[i * 2 + 2]) {
maxPos = i * 2 + 2;
}
// 最大值是当前位置结束循环
if (maxPos == i) {
break;
}
// 与子节点交换位置
swap(arr, i, maxPos);
// 以交换后子节点位置接着往下查找
i = maxPos;
}
}
}
快速排序
public class QuickSort {
// 快速排序,a是数组,n表示数组的大小
public static void quickSort(int[] a, int n) {
quickSortInternally(a, 0, n-1);
}
// 快速排序递归函数,p,r为下标
private static void quickSortInternally(int[] a, int p, int r) {
if (p >= r) return;
int q = partition(a, p, r); // 获取分区点
quickSortInternally(a, p, q-1);
quickSortInternally(a, q+1, r);
}
private static int partition(int[] a, int p, int r) {
int pivot = a[r];
int i = p;
for(int j = p; j < r; ++j) {
if (a[j] < pivot) {
if (i == j) {
++i;
} else {
int tmp = a[i];
a[i++] = a[j];
a[j] = tmp;
}
}
}
int tmp = a[i];
a[i] = a[r];
a[r] = tmp;
System.out.println("i=" + i);
return i;
}
}