大家好,今天开始给大家每天带来C++版的数据结构与算法,后面也会包括C#的系统学习。
这段代码是一个C++实现的排序算法集合。其中包括选择排序(selection sort)、冒泡排序(bubble sort)、插入排序(insertion sort)和归并排序(merge sort)。算法后越往后越难,此次做这个系列博客,是想从基础算法开始逐步上升到高阶算法。
为了让大家更好的理解算法的执行过程,给大家安利一个网站(visualgo),https://visualgo.net/en,这个网站时免费的,有不懂的地方可以去上面看算法的执行过程。如果大家还是有不懂的地方,可以评论和私信我,我会尽我所能帮助大家把算法搞懂。
#include<iostream>
using namespace std;
int a[111000];
void swap(int a[], int firstIndex, int secondIndex) {
int i = a[firstIndex];
a[firstIndex] = a[secondIndex];
a[secondIndex] = i;
}
void selectionSort(int a[], int length) {
for (int i = 0; i < length - 1; i++) {
int min_index = i;
for (int j = i + 1; j < length; j++) {
if (a[j] < a[min_index]) {
min_index = j;
}
}
swap(a, i, min_index);
}
}
void bubbleSort(int a[], int length) {
for (int i = 0; i < length; i++) {
for (int j = length - 1; j > 0; j--) {
if (a[j] < a[j - 1]) {
swap(a, j, j - 1);
}
}
}
}
void insertionSort(int a[], int length) {
for (int i = 0; i < length; i++) {
int min_index = i;
for (int j = i; j < length; j++) {
min_index = a[j] < a[min_index] ? j : min_index;
}
swap(a, i, min_index);
}
}
void merge(int a[], int l, int m, int r) {
int len = r - l + 1;
int help[len];
int i = 0;
int p1 = l;
int p2 = m + 1;
while (p1 <= m && p2 <= r) {
help[i++] = a[p1] <= a[p2] ? a[p1++] : a[p2++];
}
while (p1 <= m) {
help[i++] = a[p1++];
}
while (p2 <= r) {
help[i++] = a[p2++];
}
for (i = 0; i < len; i++) {
a[l + i] = help[i];
}
}
void mergeSort(int a[], int l, int r) {
if (l == r) {
return;
}
int mid = l + ((r - l) >> 1);
mergeSort(a, l, mid);
mergeSort(a, mid + 1, r);
merge(a, l, mid, r);
}