快排模板:
public static void quick_sort(int[] q,int l,int r){
if (l >= r) return;//数组长度为1或者0直接返回
int x = q[l+r>>1];//取中间值为参考
//Define positions of two pointers
int i = l - 1;
int j = r + 1;
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
//do Swap交换
if (i < j) {
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
这里之所以是do while循环是因为如果q[i]等于x,q[j]等于x时。两者互换,但是两者的i,j不改变没有进行++或者--,则一直卡在while循环中,死循环。循环的出口是当i>=j.
归并排序模板:
private static void merge_sort(int[] arr, int l, int r) {
// 递归结束条件
if (l >= r) return;
// 以下都为逻辑部分
int mid = l + ((r - l) >> 1);
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
//此时有两个排好序的数组,要做的就是将他们合并
int[] tmp = new int[r - l + 1]; // 临时数组, 用于临时存储 [l,r]区间内排好序的数据,长度刚好存下上面的两个数组
int i = l, j = mid + 1, k = 0; // 两个指针
// 进行归并
while (i <= mid && j <= r) {
if (arr[i] <= arr[j])
tmp[k++] = arr[i++];
else
tmp[k++] = arr[j++];
}
while (i <= mid) tmp[k++] = arr[i++];//前一个数组还有剩余
while (j <= r) tmp[k++] = arr[j++];//后一个数组还有剩余
// 进行赋值
for (i = l, j = 0; i <= r; i++, j++)
arr[i] = tmp[j];
}