首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【初阶数据结构】星河中的光影 “排” 象:排序(下)

(a, 0, n - 1, tmp); free(tmp); } ⌨️代码解读: 计算中间索引 mid,将当前数组分成两个子数组,分别递归调用 _MergeSort 函数对左右子数组进行排序,从最下面的子数组依次往上归并...3 在有效范围内(数组索引范围是 0 到 4) 当 i = 4 时:begin1 = i = 4,end1 = i + gap - 1 = 4 + 4 - 1 = 7,而数组的最大有效索引是 4,此时...4,所以 begin2 超出了数组的边界,出现越界情况 修正方法: 同 end1 越界处理情况相同 end2 越界示例 还是以长度 n = 5 的数组 arr = [1, 2, 3, 4, 5] 为例...在这个过程中,如果出现越界情况,比如 end1 或 end2 超出了数组长度,我们需要调整这些边界,以确保只处理有效的数组元素,避免访问非法内存 分批次拷贝回去直接 break: 分批次拷贝回去通常是指在发现越界情况时...这种方式简化了越界处理逻辑,因为不需要对越界的边界进行复杂的调整 end1、begin2 越界: break,等待 gap 增大时处理未处理的数据 end2 越界: 和一次性拷贝的处理相同 值得注意的是

4900
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【算法知识】详解归并排序算法

    最后一次合并的两个数组 定义两个变量 left和right,分别赋值为两个数组的首元素的索引; 初始化一个数组,数组长度为原数组大小; 再定义一个变量,t,初始化为新开的数组的第一个元素的索引,即0;...状态13 6 越界 ? 状态14 t++ ? 状态15 再把剩余的数加到数组里,直到子数组中的数都填过来; ? 状态16 动图如下: ?...* @param mid 中间索引(用来判断左边序列何时结束:到mid结束,右边序列何时开始,即mid+1) * @param right 右边数组结束的索引 * @param...//左边递归分解 mergeSort(arr, left, mid, temp); //右边递归分解 mergeSort...//左边递归分解 mergeSort(arr, left, mid, temp); //右边递归分解 mergeSort

    41740

    【初阶数据结构篇】归并排序、计数排序

    1.2 代码: void _MergeSort(int* arr, int left, int right, int* tmp) { if (left >= right) { return;...} int mid = (left + right) / 2; //[left,mid] [mid+1,right] _MergeSort(arr, left, mid, tmp); _MergeSort...{ tmp[index++] = arr[begin1++]; } else { tmp[index++] = arr[begin2++]; } } //要么begin1越界但...begin2没有越界 要么begin2越界但begin1没有越界 while (begin1 <= end1) { tmp[index++] = arr[begin1++]; } while...非比较排序) 计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤ 哈希直接定址法 取关键字的某个线性函数值作为散列地址: 直接定址法获取得到的散列函数有点就是简单,均匀也不会产生冲突 但问题是这需要事先知道关键字的分布情况

    6410

    【初阶数据结构篇】归并排序和计数排序(总结篇)

    思路其实是一样的,只不过上面这个确实是两个数组 但在归并排序里面,说是两个序列,但其实只是同一个数组里不同的区间,如果还在原数组操作会把数组的元素覆盖掉,无法排序。...第三步,我们要排序的是原数组的元素,所以每次在[left,right]区间内排好的序列要复制给arr 经过不断的合并回归,最后在arr数组里得到的就是排好序的序列了 代码如下,思路很简单,但就是第一次看整个代码可能有点懵...mid = (left + right) / 2; //[left,mid] [mid+1,right] _MergeSort(arr, left, mid, tmp); _MergeSort(...{ tmp[index++] = arr[begin1++]; } else { tmp[index++] = arr[begin2++]; } } //要么begin1越界但...begin2没有越界 要么begin2越界但begin1没有越界 while (begin1 <= end1) { tmp[index++] = arr[begin1++]; } while

    7810

    【数据结构】排序算法——Lesson2

    ; } int mid = (begin + end) / 2; //[begin, mid] [mid + 1, end] _MergeSort(arr, tmp, begin, mid);..._MergeSort(arr, tmp, mid + 1, end); int begin1 = begin, end1 = mid; int begin2 = mid + 1, end2 =...end2 ] 其中第二种和第三种可以归为一类,因为begin2越界说明我们需要排序的数据已经排好序了,越界的部分不是我们的区间我们根本不用管,直接退出循环就行了。...,不存在,不是我们需要排序的数据 if (begin2 >= n) { break; } //begin2没越界,end2越界,只需要修正一下就好 if (end2...+] = i + min; } } free(count); count = NULL; } 计数排序的时间复杂度为:O(N + range),相比较前几种排序算法,计数排序效率是非常高的,但速度快的同时也有空间消耗

    10710

    Python编程中的Bug漫谈:解决问题的艺术

    当你试图对不同类型的对象执行不兼容的操作时,就会触发类型错误。...空指针异常(NoneType Error):引发头疼的问题 另一个常见的Bug是空指针异常,通常由于尝试在None对象上执行操作而引起。...例如,假设你有一个返回None的函数,但你却尝试对其结果进行某种操作: def get_data():     # 一些操作...    ...列表越界错误(IndexError):小心列表边界 当你尝试访问列表中不存在的索引时,就会遇到列表越界错误。...这通常是由于对列表进行迭代或索引时出现的小错误引起的 my_list = [1, 2, 3] element = my_list[5]  # 引发 IndexError 避免这类Bug的方法包括确保你的索引在列表的有效范围内

    22010

    归并排序和逆序数详解

    分治算法其实应用挺多的,很多分治会用到递归,也有很多递归实现的算法是分治,但事实上分治和递归是两把事。分治就是分而治之。因为面对排序,如果不采用合理策略。每多一个数就会对整个整体带来巨大的影响。...而递归的思想和上面非递归肯定不同的,你可以想想非递归:我要考虑当前几个进行归并,每个开始的头坐标该怎么表示,还要考虑是否越界等等问题哈,写起来略麻烦。...if(left<right)//如果不是一个节点就往下递归分治 { mergesort(array, left, mid);//左区间(包过mid...)进行归并排序 mergesort(array, mid+1, right);//右区间进行归并排序 merge(array, left,mid, right...team[teamindex++]=array[rindex++]; } } while(lindex越界后剩余按序列添加即可

    55620

    解决java.lang.ArrayIndexOutOfBoundsException: Index x out of bounds for length y

    这个异常表示我们尝试访问数组中不存在的索引位置,导致程序崩溃。在接下来的内容中,我们将详细研究这个异常,包括其原因、常见场景和解决方案。 1....这个异常通常在以下情况下触发: 尝试访问数组的负数索引。 尝试访问数组的索引超过了数组的长度。 2....arr的第四个元素,但实际上它只有三个元素,因此会触发异常。...; } 3.2 使用增强型for循环 增强型for循环能够自动处理索引范围,减少了出现越界异常的机会。...System.out.println("元素值:" + element); } 总结 java.lang.ArrayIndexOutOfBoundsException异常是Java中常见的异常之一,但通过谨慎的编程和索引范围的验证

    20910

    Sort Algorithm排序算法

    最后一个是优化的,其实就是看看执行时间,代码会在GitHub上。暂时来说是最快的。 ---- ? 的完了,下面就是 ? 的了。 ⑤自顶向下的归并排序 自顶向下的一种排序,有一个数组 ?...这样就是最后的划分了,然后就是进行合并操作了,但是归并操作要注意范围,因为有时候如果是奇数的话可能会出现越界。...首先是需要一个缓存数组了,首先是把所有的数据扔到缓存数组temArray,然后需要确定范围的越界问题,如果越界了直接扔另外一个,如果没有就要确定哪个小了。...可以先随机找到一个数字是属于第几个,如果要找的是大于这个数字的索引,那就只需要找递归后面一部分的了,小于才递归前面一部分。快速排序是可以实现的,比如 ? 先随机找一个数字,比如是3,那么排完之后 ?...主要的步骤其实就是:先对整一个数组进行一个heapify操作变成一个最大堆,然后对0索引下的元素进行shiftdown操作,和倒数的几位交换即可。

    1.2K20
    领券