🔆欢迎来到我的【数据结构】专栏🔆
- 👋我是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
- {
- while (temp[i]--)
- {
- a[j++] = i+min;
- }
- }
- }