0%

排序

排序

快速排序

  1. 确定分界点(随机取任意一个数为分界点,一般取中点);
  2. 调整区间,把小于x的数移到左边,把大于x的数移到右边,把区间分为[l, j][j + 1, r]
  3. 递归左右。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* @brief 快速排序
*
*/
void QuickSort(vector<int>& nums, int l, int r)
{
if (l >= r)return;

int i = l - 1, j = r + 1, x = nums[l + (r - l) >> 1];
while (i < j)
{
do i++; while (nums[i] < x);
do j--; while (nums[j] > x);
if (i < j) swap(nums[i], nums[j]);
}
QuickSort(nums, l, j);
QuickSort(nums, j + 1, r);
}

归并排序

  1. 取数组的中间数作为分界点;
  2. 将分界点左右两边分别排好序;
  3. 将左右两边进行合并。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @brief 归并排序
*
*/
void MergeSort(vector<int>& nums, int l, int r)
{
if (l >= r) return;

int mid = l + (r - l) >> 1;
MergeSort(nums, l, mid);
MergeSort(nums, mid + 1, r);

int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r) {
if (nums[i] <= nums[j])
tmp[k++] = nums[i++];
else
tmp[k++] = nums[j++];
}


while (i <= mid) tmp[k++] = nums[i++];
while (j <= r) tmp[k++] = nums[j++];

for (i = l, j = 0; i <= r; i++, j++) nums[i] = tmp[j];
}

对应的题目

排序数组