—— 归纳总结 ——
◉ 序 & 纲要
以下的所有算法全部以函数的形式出现,可以直接单独拿出来用
◉ 排序 & 查找
—① 冒泡排序
void sort1(int array[], int len)
{
int temp; // 交换两数
for (int i = len - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
解释:
- i 的初始值:len - 1 ,表示 i 从数组的最后一项开始,往前缩。
- i 的临界值:0 ,表示直到缩至数组的第二项排序完毕
- j 的初始值:0 ,表示每次都从第一项开始与下一项进行比较
- j 的临界值:i ,表示走到数组的倒数第二项停下,因为有 j+1 存在,不能走到最后一项停,倒数第二项就覆盖整个数组了
—② 选择排序
void sort2(int array[], int len)
{
int temp; // 交换两数
int min; // 记录当前最小值
for (int i = 0; i < len - 1; i++)
{
min = i; // 把最小值置为当前值
for (int j = i + 1; j < len; j++)
{
if (array[j] < array[min]) min = j; // 保证 min 是当前最小
}
// 如果找到新的最小值,则交换
if (min != i)
{
temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
}
解释:
- i 的初始值:0 ,表示 从第一项开始,找出后面的最小值与其交换
- i 的临界值:len - 1 ,表示这种交换持续到倒数第二个数
- j 的初始值:i + 1 ,表示每次都从 i 的下一项开始遍历,找到比 i 小的值中最小的值(由 min 确定该最小值)
- j 的临界值:len ,表示每次都遍历到数组的最后一个数
—③ 快速排序
void sort3(int array[], int left, int right)
{
if (right - left <= 1) return; // 剩下的少于一个数的话就不用再排序了
int i = left, j = right; // 设置左下标和右下标的位置
int pivot = array[i]; // 把第一个设置为基准
while (i < j)
{
while (i < j && array[j] >= pivot) j--; // 向左检索,直到找到比基准小的值
array[i] = array[j];
while (i < j && array[i] <= pivot) i++; // 向右检索,直至找到比基准大的值
array[j] = array[i];
}
array[i] = pivot; // 将基准放到中间位置,此时 i==j ,使用哪个都可以
// 递归再次排序,直到 len 为 1,注意除去中间的基准
sort3(array, left, i - 1);