一、快速排序
- 确定分界点
- 取左边界Q[l]
- 取中间值Q[(l+r)/2]
- 取右边界Q[r]
- 随机取分界点
- 调整区间(以分界点为界,分界点左边的数都小于分界点的值,右边的都大于分界点的值)
- 递归处理两段
调整区间方法一:
- 数组a[]、数组b[]
- 遍历数组q[]与x进行比较,若大于x存入数组b,若小于等于存入数组a
- 再将a数组插入q,b数组插入q
方法二:双指针
- 定义两个指针i、j,分别指向两端
- 从其中一个i或者j指针开始,分别向中间移动(当i指向的数大于等于x,指针在当前位置停止)
- 移动另一个指针j,直到j第一次遇到当前指向的数小于等于x,此时交换i、j指向的位置的值,并且两指针都向中间移动一位
- 直到i与j相遇时结束
- i左边一定是小于等于x、j右边所有的数都是大于等于x
void quick_sort(int q[], int l, int r) {
if (l >= r)
return;
int x = q[l], i = l - 1, j = r + 1;
while (i < j) {
do i++;while (q[i] < x);
do j--;while (q[j] > x);
if (i < j) {
//swap(q[i], q[j]);
int item = q[i];
q[i] = q[j];
q[j] = item;
}
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r)
}
二、归并排序
- 分界点mind=(l+r)>>1
- 递归排序
- 归并
void merge_sort(int q[], int l, int r) {
//数组无元素
if (l >= r) return;
//取分界点 mind =(l+r)/2
int mid = l + r >> 1;
//两边递归排序
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
//归并
int k = 0, i = l, j = mid + 1;//k记录缓存数组元素个数、i为第一段数组左边界、j为第二段数组左边界
//二路归并
while (i <= mid && j <= r)
{
if (q[i] <= q[j]) temp[k++] = q[i++];
else
{
temp[k++] = q[j++];
}
}
while (i <= mid)
{
temp[k++] = q[i++];
}
while (j <= r)
{
temp[k++] = q[j++];
}
for (int i = l, j = 0; i <= r; i++, j++) q[i] = temp[j];
}