一、快速排序
先复习数据结构排序算法思想,再记住三个步骤,最后背code。
对一个数组排序,本题要求快排但实际很少这种题,不用多看,到时候机试背核心代码即可。
ps:y总说机试几乎没有,面试官喜欢让你手写快排核心代码。
思路:
核心代码如下:
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + 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]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
完整代码:
#include<iostream>
using namespace std;
const int N = 100010;
int a[N];
// void quick_sort(int q[], int l, int r) y总
// {
// if (l >= r) return;
// int i = l - 1, j = r + 1, x = q[l + 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]);
// }
// quick_sort(q, l, j), quick_sort(q, j + 1, r);
// }
void quick_sort(int a[], int l, int r)
{
if (l >= r) return; //不用排序
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while(i < j)
{
do{i++;}while(a[i] < x);
do{j--;}while(a[j] > x);
if (i < j) swap(a[i],a[j]);
}
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
}
int main()
{
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
quick_sort(a, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
二、归并排序
个人感觉和快排同理,复习算法思路+三步骤+核心code
思路:
核心code:
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = (l+r) / 2; //step1
merge_sort(q, l, mid); //step2
merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, k = 0; //step3 merge
while (i <= mid && j <= r)
{
if (q[i] < q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
}
while (i <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for (int i = l, j = 0; i <= r;) q[i++] = tmp[j++];
}
完整代码:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = (l+r) / 2; //step1
merge_sort(q, l, mid); //step2
merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, k = 0; //step3 merge
while (i <= mid && j <= r)
{
if (q[i] < q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
}
while (i <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for (int i = l, j = 0; i <= r;) q[i++] = tmp[j++];
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &q[i]);
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", tmp[i]);
return 0;
}