归并排序
public class MergeSort {
public int [] mergeSort (参数) {
sort(A, 0 , n-1 );
return A;
}
sort(int [] data, int left, int right) {
int middle = (left+right)/2 ;
sort(data, 0 , middle);
sort(data, middle+1 , right);
merge(data, left, middle,right);
}
merge(int [] data, int left, int middle, int right) {
1. 创建大小为left-right+1 的临时数组作为储存
2. 从前往后遍历左右两边的较小值放入临时数组
3. 将剩余的直接放入临时数组
4. 将临时数组放回原数组的相应位置
}
}
快速排序
public class quickSort {
public int [] quickSort (参数) {
quick(A, 0 , n-1 );
return A;
}
public int [] quick (int [] A, int left, int right) {
int middle=sort(A, left, right);
quick(A, left, middle);
quick(A, middle+1 , right);
return A;
}
public int sort (int [] A, int left, int right) {
int i = left, j = right;
while (left<right) {
1. 拿到key=A[i]
2. 循环1 ,判断i<j&&key<=A[j]
3. 如果跳出循环,则表示A[j]<key,将A[j]放入A[i]拿出来的坑
4. 循环2 ,判断i<j&&A[i]<=key
5. 如果跳出循环,则表示A[i]>key,将A[i]放入A[j]拿出来的坑
6. 再次循环
}
将key放到排出来的A[i]坑,返回分割值i,即middle
}
}
堆排序
public class HeapSort {
public int [] heapSort (int [] A, int n) {
for (int i=n/2 -1 ;i>=0 ;i--) {
heapAdjust(A, i, n-1 );
}
int j = n-1 ;
while (j>-1 ) {
int tmp = A[j];
A[j] = A[0 ];
A[0 ] = tmp;
heapAdjust(A, 0 , j-1 );
}
return A;
}
public void heapAdjust (int [] A, int begin, int length) {
int tmp = A[begin],child;
for (int i=begin;i*2 +1 <=length;i=child) {
child = i*2 +1 ;
if (child+1 <=length && A[child+1 ]>A[child]) {
child++;
}
if (A[child]>tmp) {
A[i] = A[child];
}else {
break ;
}
A[child] = tmp;
}
}
}