void BubbleSort(vector<int>& vec)
{
int num = vec.size();
for (int i = 0; i < num; i++) {
for (int j = 0; j < num - i - 1; j++) {
if (vec[j] > vec[j + 1]) {
int temp = vec[j];
vec[j] = vec[j + 1];
vec[j + 1] = temp;
}
}
}
}
2. 选择排序
时间复杂度:O(n^2),相等元素的相对排序可能发生改变(不稳定)
C++实现如下
void SelectSort(vector<int>& vec)
{
int num = vec.size();
for (int i = 0; i < num - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < num; j++) {
if (vec[min_idx] > vec[j]) {
min_idx = j;
}
}
if (min_idx != i) {
int temp = vec[i];
vec[i] = vec[min_idx];
vec[min_idx] = temp;
}
}
}
3. 插入排序
时间复杂度:O(n^2),相等元素的相对排序不会改变(稳定)
C++实现如下
void InsertSort(vector<int>& vec)
{
int num = vec.size();
for (int i = 1; i < num; i++) {
int idx = i;
int val = vec[i];
while (idx > 0 && vec[idx - 1] > val) {
vec[idx] = vec[idx - 1];
idx--;
}
vec[idx] = val;
}
}
4. 归并排序
时间复杂度:O(n*log(n)),相等元素的相对排序不会改变(稳定)
C++实现如下
vector<int> _MergeSort(vector<int>& v, int left, int right)
{
vector<int> ret;
if (left == right) {
ret.emplace_back(v[left]);
return ret;
}
int mid = (left + right) / 2;
vector<int> v1 = _MergeSort(v, left, mid);
vector<int> v2 = _MergeSort(v, mid + 1, right);
int idx1 = 0;
int idx2 = 0;
int cnt = 0;
ret.resize(v1.size() + v2.size());
while (idx1 < v1.size() && idx2 < v2.size()) {
if (v1[idx1] <= v2[idx2]) {
ret[cnt++] = v1[idx1++];
}
else {
ret[cnt++] = v2[idx2++];
}
}
if (idx1 < v1.size()) {
for (int i = idx1; i < v1.size(); i++) {
ret[cnt++] = v1[idx1++];
}
}
else {
for (int i = idx2; i < v2.size(); i++) {
ret[cnt++] = v2[idx2++];
}
}
return ret;
}
void MergeSort(vector<int>& vec)
{
int num = vec.size();
if (num == 0) {
return;
}
vec = _MergeSort(vec, 0, num - 1);
}
5. 快速排序
时间复杂度:O(n*log(n)),相等元素的相对排序可能发生改变(不稳定)
C++实现如下
void _QuickSort(vector<int>& v, int low, int high)
{
if (low >= high) {
return;
}
int start = low;
int end = high;
int val = v[start];
while (start < end) {
while (start < end && val <= v[end]) {
end--;
}
v[start] = v[end];
while (start < end && v[start] <= val) {
start++;
}
v[end] = v[start];
}
// When the index start meets the index end, set the meeting position
// as the index pivot. After this, all values in [low, pivot) are not bigger
// than val, and all values in (pivot, high] are not smaller than val.
int pivot = start;
v[pivot] = val;
_QuickSort(v, low, pivot - 1);
_QuickSort(v, pivot + 1, high);
}
void QuickSort(vector<int>& vec)
{
int num = vec.size();
if (num == 0) {
return;
}
_QuickSort(vec, 0, num - 1);
}
6. 堆排序
时间复杂度:O(n*log(n)),相等元素的相对排序可能发生改变(不稳定)
C++实现如下
void _AdjustHeap(vector<int>& v, int parent, int last)
{
int leftChild = 2 * parent + 1;
while (leftChild <= last) {
int rightChild = leftChild + 1;
int largerIdx;
if (rightChild <= last && v[leftChild] < v[rightChild]) {
largerIdx = rightChild;
}
else {
largerIdx = leftChild;
}
if (v[parent] < v[largerIdx]) {
int val = v[parent];
v[parent] = v[largerIdx];
v[largerIdx] = val;
parent = largerIdx;
leftChild = 2 * parent + 1;
}
else {
break;
}
}
}
void HeapSort(vector<int>& vec)
{
int last = vec.size() - 1;
int parent = (last - 1) / 2;
// Initialize the heap, where the root node (the first one)
// is the largest value.
while (parent >= 0) {
_AdjustHeap(vec, parent, last);
parent--;
}
// Put the largest value of the heap (the first one) to the end,
// and readjust the heap.
while (last >= 0) {
int val = vec[last];
vec[last] = vec[0];
vec[0] = val;
last--;
_AdjustHeap(vec, 0, last);
}
}