🔆欢迎来到我的【数据结构】专栏🔆
- 👋我是Brant_zero,一名学习C/C++的在读大学生。
- 🌏?我的博客主页????????Brant_zero的主页
- 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏
🍁前言
????????堆排序、希尔排序、快速排序、归并排序这几个BOSS过后,我们将剩下三个比较简单的排序再实现一下,总算把八大排序都学习完了~~~
目录
一、 冒泡排序
二、 选择排序
三、计数排序
一、 冒泡排序
冒泡排序算法的原理如下:?
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。? -
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素会是最大的数。? -
针对所有的元素重复以上的步骤,除了最后一个。? -
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。?
我们来看看下面的动图:
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void BubbleSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)
{
int exchange = 1;
for (int j = 0; j < n - 1 - i; j++)
{
if ( a[j + 1]< a[j])
{
swap(&a[j], &a[j + 1]);
exchange = 0;
}
}
if (exchange)
break;
}
}
二、 选择排序
选择排序算法原理如下:
-
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 -
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 -
重复第二步,直到所有元素均排序完毕
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void SelectSort(int* a, int n)
{
for (int i = 0; i < n-1; i++)
{
int temp = i;
for (int j = i+1; j < n; j++)
{
if (a[j] < a[temp])
{
temp = j;
}
}
swap(&a[temp], &a[i]);
}
}
三、计数排序
计数排序算法原理如下:
- 计算出当前数据集合的范围区间range,即最大值 - 最小值。
- 开辟range大小的计数表(使用calloc),记录每个数据出现的次数。
- 统计每个数出现的次数,放到减去最小值后其在计数表中的相对位置。
- 回写数据。遍历计数表,如果表中位置不为零,则直接回写到元素组中,其值为下标 + 最小值,则可将相对位置转回为绝对位置。
void CountSort(int* a, int n)
{
int max = a[0];
int min = a[0];
for (int i = 1; i < n; i++)
{
if (max < a[i])
max = a[i];
if (min > a[i])
min = a[i];
}
int range = max - min+1;
int* temp = (int*)calloc(range, sizeof(int));
for (int i = 0; i < n; i++)
{
temp[a[i] - min]++;
}
//回写
int j = 0;
for (int i=0;i<range;i++)
{
while (temp[i]--)
{
a[j++] = i+min;
}
}
}
|