https://zhuanlan.zhihu.com/p/449501682
https://blog.csdn.net/mwj327720862/article/details/80498455?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169837129516800222848165%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=169837129516800222848165&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-80498455-null-null.142v96pc_search_result_base5&utm_term=%E5%8D%81%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95c%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187
算法分类

算法复杂度

相关概念

void bubbleSort(int *arr, int size) {
/*只需要确定size - 1个最大数,最后一个自然就出来了*/
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
算法原理
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
动画演示

代码实现
void selectionSort(int *arr, int size) {
/*同样地,确定好了size-1个最小值,最后一个就是最大值*/
for (int i = 0; i < size - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < size; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
算法原理
构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
动画演示

代码实现
void insertionSort(int *arr, int size) {
/*选择插入的元素应当从第二个元素开始*/
for (int i = 1; i < size; i++) {
for (int j = i; j > 0; j--) {
/*每次将该元素与前一个元素进行比较,符合条件就移动,否则直接结束循环*/
if (arr[j] < arr[j - 1]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
} else {
break;
}
}
}
}