一、归并排序
算法思路:简单来说,就是将一个数组左右分为两半,然后再次细分,逐渐分为两个元素。最后比较大小,然后进行合并。(一般使用递归方法)
递推公式:
merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))
终止条件:
p >= r 不用再继续分解
代码:
public void MergeSort(int[] a, int n){
if(n <= 1) return;
Merger_Sort_c(a, 0, n-1);
}
public void Merger_Sort_c(int[] a, int l, int r){
if(l >= r) return l;
int mid = l + ( r - l)/2;
Merger_Sort_c(a, l, mid);
Merger_Sort_c(a, mid+1, r);
mergering(a, l,mid,r);
}
private static void mergering(int[] a, int p, int q, int r) {
int i = p;
int j = q+1;
int k = 0; // 初始化变量i, j, k
int[] tmp = new int[r-p+1]; // 申请一个大小跟a[p...r]一样的临时数组
while (i<=q && j<=r) {
if (a[i] <= a[j]) {
tmp[k++] = a[i++]; // i++等于i:=i+1
} else {
tmp[k++] = a[j++];
}
}
// 判断哪个子数组中有剩余的数据
int start = i;
int end = q;
if (j <= r) {
start = j;
end = r;
}
// 将剩余的数据拷贝到临时数组tmp
while (start <= end) {
tmp[k++] = a[start++];
}
// 将tmp中的数组拷贝回a[p...r]
for (i = 0; i <= r-p; ++i) {
a[p+i] = tmp[i];
}
}
二、快速排序
算法思路:首先选取一个中间点pivot,将这个数组左右元素划分为两个部分,比这个pivot小的部分放在左边,比它大的放在右边。按照上述步骤进行递归。
递推公式:
quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1… r)
终止条件:
p >= r
public static void QuickSort(int[] a, int n){
if( n <= 1 )return;
Q_Sort(a, 0, n-1);
}
public static void Q_Sort(int[] a, int l, int r){
if(l <= r){
int pivot = Partition(a, l, r);
Q_Sort(a, l, pivot)
Q_Sort(a, pivot+1, r);
}
}
public static void Partition(int[] a, int l, int r){
int point = a[r];
int i = j = l;
for(; j < r ;j++){
if(a[j] < point){
if(i == j){
++i;
}else{
int temp = a[j];
a[j++] = a[i];
a[i] = temp;
}
}
}
int m = a[i];
a[i] = a[r];
a[r] = m;
}