快速排序: —— 分治
1.确定分界点(x,i,j)
2.调整区间(左右遍历,排出小于x的左部分和大于x的右部分)
3.递归处理左、右两段
手写快排:
void quick_sort(int q[], int l, int r) {
if(l >= r) return; // 判断当前区间长度
int x = q[l+r>>1], i = l, j = r; // 随便取x
while(1) {
while(q[i] < x) i = i + 1;
while(q[j] > x) j = j - 1;
if(i >= j) break;
swap(q[i], q[j]);
i = i + 1;
j = j - 1;
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
归并排序:分治
1.确定分界点:mid (l+r >> 1)
2.递归,排序左右两边
3.归并 —— 合二为一(再将有序数组放回 )
时间复杂度:nlogN
手写归并排序:
void merge_sort(int l, int r) {
bool flag = 0;
if(l >= r) return;
int mid = l + r >> 1;
merge_sort(l, mid), merge_sort(mid+1, r);
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r) {
if(q[i] <= q[j]) w[k++] = q[i++];
else w[k++] = q[j++];
}
while(i <= mid) w[k++] = q[i++];
while(j <= r) w[k++] = q[j++];
for(int i = l, k = 0; i <= r; i++, k++) q[i] = w[k];
}
在此声明,本博客只是为了整理算法模板供自己后续翻阅,希望不要因为内容粗略影响您的学习。