基础算法
快速排序(QuickSort)
算法思想:
- 首先设置一个分界值 pivot,通过该分界值将数组分成左右两个部分 partition,将小于分界值的数据集中到数组左边、大于或等于分界值的数据集中到数组右边。此时左边部分中个元素都小于或等于分界值,而右边各部分中的元素都大于或等于分界值。
- 将上面分割的区间继续分割 递归执行此步骤,直至不能再划分为止。
代码实现:
void quickSort(vector<int> &a, int l, int r) {
if (l > r) return ;
int mid = l + r >> 1;
int x = a[mid];
int i = l - 1, j = 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]);
}
quickSort(a, l, i - 1);
quickSort(a, j + 1, r);
}
归并排序(MergeSort)
算法思想:
分:先递归将数组分成只有一个元素的有序数组。
治:合二为一:将两个有序数组合并成一个有序数组。
代码实现:
void mergeSort(vector<int> &a, int l, int r) {
if (l >= r) return ;
int mid = l + r >> 1;
mergeSort(a, l, mid);
mergeSort(a, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r) {
if(a[i] < a[j])
temp[++ k] = a[i ++];
else
temp[++ k] = a[j ++];
}
while(i <= mid) temp[++ k] = a[i ++];
while(j <= r) temp[++ k] = a[j ++];
for (int i = l, j = 0; i <= r; i ++) {
a[i] = temp[++ j];
}
}