段子界的孔子 发表于 2021-3-31 18:14

(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);
}

我就想知晓这算不算是归并排序,因为备考用到的,代码如有错误,还请大佬不吝赐教哈

QingYi. 发表于 2021-3-31 19:05

len 直接/2?
len>>=1

段子界的孔子 发表于 2021-3-31 21:35

本帖最后由 段子界的孔子 于 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 ;

Mr.jed 发表于 2021-3-31 18:27

我爱大脸娃 发表于 2021-3-31 18:20
你好,能带我入门么?现在啥也看不懂都不知道从哪开始学习。

你可以从网上的一些,免费课程开始学习。

段子界的孔子 发表于 2021-3-31 18:48

我爱大脸娃 发表于 2021-3-31 18:20
你好,能带我入门么?现在啥也看不懂都不知道从哪开始学习。

b站就挺多教程的,可以去看看

反转星球 发表于 2021-3-31 20:21

这是用什么IDE写的呀

zjf919 发表于 2021-3-31 20:26

谢谢大神分享!学习一下!

啊哈啊 发表于 2021-3-31 20:49

加油!!

kof888 发表于 2021-3-31 20:51

这个循环里,++i和i++应该是一样的吧,

段子界的孔子 发表于 2021-3-31 21:38

反转星球 发表于 2021-3-31 20:21
这是用什么IDE写的呀

图方便给用的Clion,但代码样式风格是论坛的,不太会刷格式
页: [1] 2
查看完整版本: (C语言)小白自己写了个归并排序