1 // 冒泡排序
2 // 2个相邻的元素相互比较,不满足顺序则交换;每遍历一次数组,使一个元素处于最终位置。
3 void BubbleSort(std::vector<int>& nums)
4 {
5 if(nums.empty())
6 {
7 return;
8 }
9
10 bool sorted = false; // 假设没有排好序
11 size_t n = nums.size();
12
13 while(!sorted)
14 {
15 sorted = true; // 假设已经排好序
16 for(int i = 1; i < n; ++i)
17 {
18 if(nums[i-1] > nums[i])
19 {
20 std::swap(nums[i-1], nums[i]);
21 sorted = false; // 恢复为已排好序
22 }
23 }
24 --n; // 已经排好序的元素不必再参与排序了
25 }
26 }
27
46 // 快速排序
47 // 随机在数组中选择一个元素,作为划分元素,将数组中比划分元素小的交换到左侧,
48 // 比划分元素大的交换到右侧,最后将划分元素交换到左右区间的连接处,则划分元素处于了最终位置;
49 // 递归地对左右区间进行快速排序。
50 int Partition(vector<int>& vec, int low, int up)
51 {
52 int pivot = vec[up];
53 int i = low - 1;
54
55 for(int j = low; j < up; ++j)
56 {
57 if(vec[j] <= pivot)
58 {
59 ++i;
60 std::swap(vec[i], vec[j]);
61 }
62 }
63 std::swap(vec[i+1], vec[up]);
64
65 return i+1;
66 }
67
68 void QuickSort(vector<int>& vec, int low, int up)
69 {
70 if(low < up)
71 {
72 int mid = Partition(vec, low, up);
73
74 QuickSort(vec, low, mid - 1);
75 QuickSort(vec, mid + 1, up);
76 }
77 }
1 /*
2 插入排序
3 */
4 void InsertionSort(std::vector<int>& vec)
5 {
6 int num = vec.size();
7
8 for (int i = 1; i < num; ++i)
9 {
10 for (int j = i; j > 0 && vec[j] < vec[j - 1]; --j)
11 {
12 std::swap(vec[j], vec[j - 1]);
13 }
14 }
15 }
1 /*
2 归并排序
3 */
4
5 class MergeSort
6 {
7 public:
8 void merge(std::vector<int>& vec, int low, int mid, int high)
9 {
10 int i = low; int j = mid + 1;
11
12 for (int k = low; k <= high; ++k)
13 {
14 aux_[k] = vec[k];
15 }
16
17 for (int k = low; k <= high; ++k)
18 {
19 if (i > mid)
20 {
21 vec[k] = aux_[j++];
22 }
23 else if (j > high)
24 {
25 vec[k] = aux_[i++];
26 }
27 else if (aux_[j] < aux_[i])
28 {
29 vec[k] = aux_[j++];
30 }
31 else
32 {
33 vec[k] = aux_[i++];
34 }
35 }
36 }
37
38 void merge_sort(std::vector<int>& vec, int low, int high)
39 {
40 if (low >= high)
41 {
42 return;
43 }
44
45 int mid = low + (high - low) / 2;
46
47 merge_sort(vec, low, mid);
48 merge_sort(vec, mid + 1, high);
49 merge(vec, low, mid, high);
50 }
51
52 void sort(std::vector<int>& vec, int low, int high)
53 {
54 aux_.resize(vec.size());
55 merge_sort(vec, 0, vec.size() - 1);
56 }
57
58 private:
59 static std::vector<int> aux_;
60 };
61
62 std::vector<int> MergeSort::aux_;
/*
选择排序
*/
void SelectionSort(std::vector<int>& vec)
{
int num = vec.size(); // 向量大小
for (int i = 0; i < num; ++i) // 外循环 从下标0开始
{
int min = i; // 最小元素的下标
for (int j = i + 1; j < num; ++j) // 从i的下一个元素开始
{
if (vec[j] < vec[min])
{
min = j;
}
}
std::swap(vec[i], vec[min]);
}
}