话不多说,直接上代码。
带有一些注释,方便理解。
不懂的可以看《小白算法》里的解释。
#include <bits/stdc++.h>
using namespace std;
#define block_system \
getchar(); \
system("pause")
void quick_sort(int *ptr, int left, int right)
{
if (left > right)
return; //退出条件
int temp = ptr[left];
int i = left, j = right, exchange_;
while (i != j) // right first
{
while (ptr[j] >= temp && i < j) //定位到一个小于基准数的位置
j--;
while (ptr[i] <= temp && i < j) //定位到一个大于基准数的位置
i++;
if (i < j)
{
exchange_ = ptr[j];
ptr[j] = ptr[i];
ptr[i] = exchange_;
}
//最终的时候,j会和i重合,此时对应一个小于基准数的下标
}
//基准数回家
ptr[left] = ptr[i]; //此处是j也可以,因为此时i j重合且此时数小于基准数,直接左移
ptr[i] = temp;
//二分,递归处理剩下的数组
quick_sort(ptr, left, i - 1);
quick_sort(ptr, j + 1, right);
//关于递归,可以想象多米诺骨牌:推的动作是一块块传递下去,但要得到"倒下"的结果
//当最后一块倒下,倒下的结果再逆向向前传递到第一个,直到第一块完成,此时递归完成。
}
void bubble_sort(int *ptr, int len)
{
int temp_exchnage;
for (int i = 1; i <= len - 1; ++i) //只需要进行len-1次冒泡
{
for (int j = 1; j <= len - i; ++j) //竖向传递
{
//冒泡 咕噜咕噜
if (ptr[j] < ptr[j + 1]) //横向传递
{
temp_exchnage = ptr[j + 1];
ptr[j + 1] = ptr[j];
ptr[j] = temp_exchnage;
}
}
}
}
void bucket_sort(int *num_ptr, int *result_ptr, int len, bool is_repeat)
{
if (is_repeat) //是否去重
{
for (int i = 1; i <= len; ++i)
{
if (num_ptr[i] >= 0)
result_ptr[num_ptr[i]] = 1;
}
}
else
{
for (int i = 1; i <= len; ++i)
{
if (num_ptr[i] >= 0)
result_ptr[num_ptr[i]]++;
}
}
}
int main()
{
int temp_sort[100];
int n;
cin >> n; //个数
for (int i = 1; i <= n; ++i) //此处采用习惯排列,以1为初始坐标
{
cin >> temp_sort[i];
}
//使用哪种排序方式
#ifdef use_quick_sort
quick_sort(temp_sort, 1, n);
#endif
#ifdef use_bubble_sort
bubble_sort(temp_sort, n);
#endif
#ifdef use_bucket_sort
int result[1000] = {0};
bubble_sort(temp_sort, result, n, true);
#endif
block_system;
return 0;
}`
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复