(C语言)小白自己写了个归并排序
本帖最后由 段子界的孔子 于 2021-3-31 18:26 编辑void merge_sort(int arr[], int len) {
/*
step2-用于终止递归条件
*/
if(len <= 2) {
if (len == 2 && arr > arr)
swap(&arr, &arr);
return;
}
/*
step1-分段:mor用于求分段中值,以mor为中值分成两小段段进入递归
*/
int mor = len/2;
//左半段递归
merge_sort(&arr, mor);
//右半段递归
merge_sort(&arr, len - mor);
/*
step3-整合:将两段有序序列整合排序成一段有序序列
*/
//把arr中整段数据克隆到b
int *b = (int *) malloc(len * sizeof(int));
for (int i = 0; i < len; ++i) {
b = arr;
}
// 以b作为参考数组,把arr大段排序:j 为b[]左半端指针, k 为b[]的右半段指针, n 为arr排序位指针;j的取值区间,k的取值区间
int j = 0, k = mor;
for (int i = 0; i < len; ++i) {
if (j < mor && k < len) // 如果两段中,都存在未排列数组,则把首位较小的数给安排上
arr = b < b ? b : b;
else// 否则,则另一段的未排列数据直接补上
arr = (j < mor) ? b : b;
}
free(b);
}
我就想知晓这算不算是归并排序,因为备考用到的,代码如有错误,还请大佬不吝赐教哈
len 直接/2?
len>>=1 本帖最后由 段子界的孔子 于 2021-3-31 21:47 编辑
QingYi. 发表于 2021-3-31 19:05
len 直接/2?
len>>=1
对于位运算我是真的不咋会,哈哈
不过这里我斟酌过,参考某些民间代码也是简单粗暴/2然后我就跟风了。主要是想省代码
mor用来求小于len的2的n次幂,之前的版本写是
mor = 2;
while (mor * 2 < len)
mor *=2 ;
我爱大脸娃 发表于 2021-3-31 18:20
你好,能带我入门么?现在啥也看不懂都不知道从哪开始学习。
你可以从网上的一些,免费课程开始学习。 我爱大脸娃 发表于 2021-3-31 18:20
你好,能带我入门么?现在啥也看不懂都不知道从哪开始学习。
b站就挺多教程的,可以去看看 这是用什么IDE写的呀 谢谢大神分享!学习一下! 加油!! 这个循环里,++i和i++应该是一样的吧, 反转星球 发表于 2021-3-31 20:21
这是用什么IDE写的呀
图方便给用的Clion,但代码样式风格是论坛的,不太会刷格式
页:
[1]
2