一.冒泡排序
冒泡排序的理解就在于冒泡,听起来就像鱼吐泡泡一样,其实确实有点像。冒泡排序就是循环每次冒出最大的那个值或者最小值,把它放在前面或者后面,下面举个简单的例子:

下面用代码实现:
//升序
void bubble_sort_up(int* arr, int len)
{
//外循环要n-1次
for (int i = 0; i < len - 1; i++)
{
//内循环要找大的往后面冒
for (int j = 0; j < len - i - 1; j++)
{
//开始比较往后挪,如果符合就往后冒
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
travel(arr, len);//每循环冒出一颗打印一次
}
}

可以看到,每一层都冒出来最大的那个,那降序的写法呢,也是一样的:
//降序
void bubble_sort_down(int* arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j] < arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
travel(arr, len);
}
}
做一些小优化的写法:
//优化升序,降序同理
void bubble_sort(int* arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
bool flag = false;
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
if (!flag)
{
return;
}
}
}
二.选择排序
选择排序,顾名思义就是要选择,那如何选择呢?每次从待排数组中挑出最小或者最大的摆在相应的位置。这里我们需要和上面的冒泡排序区分一点的就是,选择排序在比较结束之后并不会直接交换两个元素的位置,只是记录当前序列中的最小元素 ,当找到最小的元素之后,在将该最小元素与队头的元素进行置换。

下面用代码实现:
//升序
void select_sort_up(int* arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
//暂时把循环的第一个作为最大的
//记录最小的那个的下标
int minPos = i;
for (int j = i; j < len-1; j++)
{
if (arr[j + 1] < arr[minPos])
{
minPos = j + 1;
}
}
if (arr[i] > arr[minPos])
{
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
travel(arr, len);
}
}

降序写法也同理:(降序加优化,跟冒泡原理一样)
//降序
void select_sort_down(int* arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
int maxPos = i;
bool flag = false;
for (int j = i; j < len - 1; j++)
{
if (arr[j + 1] > arr[maxPos])
{
maxPos = j + 1;
flag = true;
}
}
if (!flag)
{
return;
}
if (arr[maxPos] > arr[i])
{
int temp = arr[i];
arr[i] = arr[maxPos];
arr[maxPos] = temp;
}
travel(arr, len);
}
}
三.插入排序
插入排序就是每次把待排数组中第一个插入到已序数组中。

下面用代码实现:
//升序
void insert_sort_up(int* arr, int len)
{
for (int i = 1; i < len; i++)
{
int temp = arr[i];
int insertPos = i;
//找插入位置
for (; insertPos > 0 && arr[insertPos - 1] > temp; insertPos--)
{
arr[insertPos] = arr[insertPos - 1];
}
//找到后插入
arr[insertPos] = temp;
travel(arr, len);
}
}

降序也是同理:关键就是要找到插入位置
//降序
void insert_sort_down(int* arr, int len)
{
for (int i = 1; i < len; i++)
{
int temp = arr[i];
int insertPos = i;
for (; insertPos > 0&& arr[insertPos - 1] < temp; insertPos--)
{
arr[insertPos] = arr[insertPos - 1];
}
arr[insertPos] = temp;
travel(arr, len);
}
}
四.希尔排序
希尔排序是升级版的插入排序,只是比插入排序多了一个步骤:确定步长。

下面是实现代码:
//升序
void shell_sort_up(int* arr, int len)
{
//确定初始步长
int step = len >> 1;
for (; step > 0; step >>= 1)
{
//每次把下标为i的数插到已序数组里
for (int i = step; i < len; i++)
{
//临时存储待插数据
int temp = arr[i];
int insertPos = i - step;
//开始找插入位置,也就是插入排序的代码
for (; insertPos >= 0 && arr[insertPos] > temp; insertPos -= step)
{
arr[insertPos + step] = arr[insertPos];
}
//找到后插入
arr[insertPos + step] = temp;
}
travel(arr, len);
}
}

降序也是同理:
//降序
void shell_sort_down(int* arr, int len)
{
int step = len >> 1;
for (; step > 0; step >>= 1)
{
for (int i = step; i < len; i++)
{
int temp = arr[i];
int insertPos = i - step;
for (; insertPos >= 0 && arr[insertPos] < temp; insertPos -= step)
{
arr[insertPos + step] = arr[insertPos];
}
arr[insertPos + step] = temp;
}
travel(arr, len);
}
}
本文详细介绍了四种基本排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体实例和代码实现展示了每种算法的工作原理及其优化方法。
2109

被折叠的 条评论
为什么被折叠?



