首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    动态矩阵(指针与堆内存分配)

    题目描述 未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n 要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。...不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、 创建的矩阵大小必须和输入的行数m和列数n一样 输入 第一行输入t表示t个测试实例 第二行输入两个数字m和n,表示第一个矩阵的行数和列数...第三行起,连续输入m行,每行n个数字,表示输入第一个矩阵的数值 依次输入t个实例 输出 每行输出一个实例的最小值和最大值 输入样例1 2 2 3 33 22 11 66 88 55 3 4...][maxj]) { maxi=i; maxj=j; } if(p[i][j]mini][minj]) { mini=i; minj=j;...} } coutmini][minj]maxi][maxj]<<endl; for(i=0;i<m;i++) delete[] p[i]; delete

    16910

    排序5:直接选择排序

    ( 第一个 )元素,则将它与这组元素中的最后一个(第一个)    元素交换 · 在剩余的 array[i]--array[n-2] ( array[i+1]--array[n-1] )集合中...,重复上述步骤,直到集合剩余 1 个元素 演示图: 代码实现 单趟思路: 设置四个 int 类型数据 mini 、maxi 、begin、end 记录这一趟中所遇到的最小值与最大值以及开头和结尾的下标...遍历一遍找到所对应的值,交换 mini 和 begin  以及 maxi 和 end 对应的数据的值。...分析:如果第一个是最大值是在begin的位置,在 mini 和 begin 交换时被换走之后但是maxi仍然指向怎么办? 很简单,我们只需要做出以下操作,将maxi改正到指向正确的值上即可。...[mini]) { mini = i; } } Swap(&a[mini], &a[begin]); //避免了如果第一个数最大,会被换走,但是maxi还指向第一个数 if (maxi

    13610

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

    和maxi重叠,交换后修正一下 if (left == maxi) { maxi = mini; } Swap(&a[right], &a[maxi]); ++left;...--right; } } ⌨️代码解读: mini 初始化为 left,maxi 初始化为 right,用于记录当前未排序部分的最小值和最大值的索引 通过 for 循环从 left 到 right 遍历数组...,比较每个元素与 a[mini] 和 a[maxi] 的大小,如果发现更小的元素则更新 mini,如果发现更大的元素则更新 maxi 调用 Swap 函数将最小值 a[mini] 交换到左边界 a[left...] 的位置,最大值 a[maxi] 交换到右边界 a[right] 的位置 ++left 和 --right 分别将左边界右移和右边界左移,缩小未排序部分的范围 值得注意的是: 如果 left 恰好等于...maxi,说明在交换最小值时,最大值的位置已经被交换到了 mini 处,所以需要将 maxi 更新为 mini ️复杂度分析: • 时间复杂度: ○ 最好情况: 即使数组已经有序,每一轮仍然需要遍历未排序部分来确定最小值和最大值的位置

    5700

    排序算法-选择堆排序(C语言)

    选择排序的单趟就是找出最大的值的下标maxi和最小值的下标mini,然后将最小值放在最左边,最大值放在最右边。...首先写一个单趟,maxi和mini都在同一个位置(最左边),然后写一个for循环,下标i用来遍历数组,i的起始位置是begin+1,结束条件是i>end,进入循环开始找最大值和最小值的下标,循环结束意味着...maxi和mini已经到了相应的位置,就可以开始交换值了,交换完最小值后要注意一下,如果maxi一直是begin这个位置,那么就已经被换走了,换到了a[mini]这个位置,所以要修正一下,将maxi=mini...那么单趟走完之后begin++,end--,每次进入循环maxi和mini都在begin这个位置,所以最外层套一个while循环,结束条件是begin>=end。...&a[mini]); if (maxi == begin) { maxi = mini; } Swap(&a[end], &a[maxi]); begin++; end--

    23810

    直接选择排序:最通俗易懂的排序算法

    每次遍历找到最大的和最小的俩个数en来存放在开头和末尾然后再一次重新遍历直到数组全部遍历完毕 begin == end 二、选择排序的构建 在元素集合array[i]–array[n-1]中选择关键码最大...[n-1])集合中,重复上述步骤,直到集合剩余1个元素 2.1 选择排序的优化 上图每次都是找到其中一个数来进行排序,其实我们实际代码是可以优化一下的每次从 前面开始找到 最大的 和最小的 然后最小的放在前面...= begin, maxi = begin; for (int i = begin+1; i <= end; i++) { if (a[mini] > a[i]) { mini...= i; } if (a[maxi] < a[i]) { maxi = i; } } Swap(&a[mini], &a[begin]); if...(maxi == begin) { maxi = mini; } Swap(&a[maxi], &a[end]); begin++; end--; } } 代码结果:

    29810

    【数据结构】八大排序之简单选择排序算法

    若它不是这组元素中的第一个(最后一个)元素,则将它与这组元素中的第一个(最后一个)元素交换....= i; } if (a[i] > a[maxi]) { maxi = i; } } Swap(&a[left], &a[mini]); //如果left...和maxi重叠,交换后需要修正一下再交换right和maxi if (left == maxi) { maxi = mini; } Swap(&a[right], &a[maxi...]); left++; right--; } } 注意: 当我们在一趟比较结束后选出mini和maxi并做交换的时候,要小心如果left记录的位置恰好存放的是maxi,则第一步交换...left和mini后我们就要重新对maxi的位置做一个修正,如图: 四.简单选择排序的时间复杂度分析 我们可以发现,简单选择排序的特点是: 元素挪动交换次数很少,但是元素比较次数很多,并且无论是数组天生顺序的情况还是天生逆序的情况

    60010

    【初阶数据结构篇】插入、希尔、选择、堆排序介绍(上篇)

    ]); ++begin; --end; } } 看似思路是没有问题的,但如果我们将其用来排序下列数据,排升序 进入循环,mini找到1,maxi还是在9,此时我们将再将mini和begin...交换,maxi与end交换, end++,begin–跳出循环,排序完成仍然是931,出现了问题 改进如下: //避免maxi begini都在同一个位置,begin和mini交换之后,maxi数据变成了最小的数据...if (maxi == begin) { maxi = mini; } 这样当我们将mini和begin交换完成后,maxi所指向的仍然是最大的数据,将其再与end交换 完整代码:...maxi = i; } if (arr[i] mini]) { mini = i; } } //mini begin //maxi end...//避免maxi begini都在同一个位置,begin和mini交换之后,maxi数据变成了最小的数据 if (maxi == begin) { maxi = mini; }

    9610

    【初阶数据结构与算法】八大排序算法之选择排序(直接选择排序、堆排)

    mini = i; } if (arr[i] > arr[maxi]) { maxi = i; } } Swap(&arr[begin], &arr[mini])...,把这个最大值交换到mini位置上去了    然后maxi和end位置数据进行交换时,end就拿到了最小值,所以最后导致了上面的问题,根本原因就是最大值在begin的位置上,所以我们想个办法来优化一下...   由于begin和mini位置的数据总是先交换,如果begin位置就是最大值的话,经过begin和mini的交换后,这个最大值就会跑到mini的位置上去,所以我们解决的方案就是,如果begin位置就是最大值的话...,让maxi = mini    这样的话经过begin和mini的一次交换,将最大值交换到了mini的位置, 现在我们又让maxi走到mini的位置,maxi现在指向的就是最大值,可以放心交换,如图...mini = i; } if (arr[i] > arr[maxi]) { maxi = i; } } if (begin == maxi) { maxi

    11710

    【数据结构实战】一起开启数据结构有序之门

    = j; for (i = j; i < n; i++) { if (a[mini] > a[i]) { maxi = i; } } swap(&a[tmp]..., &a[mini]); } } 这样每次都选了最小的,然后依次排序,但是这样的空间复杂度为O(N^2),效率很低,可以在每次选择的时候都把最大的和最小的选出来,然后再排序,就能优化一些...{ mini = i; } if (a[maxi] < a[i]) { maxi = i; } } swap(&a[right], &a[maxi]);...if(mini ==right) { mini = maxi; } swap(&a[left], &a[mini]); left++; right--; } }...(也可以是其他的数字,这里以左边第一个为例子) 再把他放到合适的位置上面(合适的位置指的就是前面的数字比他小,后面的数字比他大) 再依次重复上述步骤,直到序列有序为止 4.2.2 快速排序代码实现

    7410
    领券