写循环时遇到和自己排序想法相违背的排序方法,例如 我想正序排序,输出结果是倒序排序

发布时间:2024年01月23日

循环的具体步骤如下所示,自己循环一遍恍然大悟,因为数组是动态改变的,外层循环一次,内层循环都要从头开始,从数组[0]开始比较,这就导致了,如果是正序排序,后面大的结果会和前面小的结果进行比较,交换位置,这便是造成和自己排序想法相违背的原因。

序号012345设想是正序排序
小的在坐,大的在右
315024如果i大于j则交换位置
第一次135024外层i递增一次
03512? ? ? ?4内层j循环一遍
          
序号012345黄标是i的值
j的值每次循环从0开始递增
035124
第二次305124
          
序号012345
305124
第三次503124
530124
          
序号012345
530124
第四次531024
          
序号012345
531024
第五次532014
532104
          
序号012345
532104
第五次542103
543102
543201
543210
????? 五次循环结束时排序完成,但是排序结果和初衷相违背,是倒序排序。

?

主要循环代码如下:

for (int i = 0; i < arrNum.length; i++) {
    for (int j = 0; j < arrNum.length; j++) {
        if (arrNum[i] > arrNum[j]) {//若arrNum[0]为最大值
            int temp = arrNum[i];//临时变量储存一个值
            arrNum[i] = arrNum[j];
            arrNum[j] = temp;
        }
    }
}

?

当然若是不想使用冒泡排序,也可以使用这个方法,不过需要进行改进,

以升序排序为例,设想的是小的在左边,大的在右边,

通过上面的第一次排序过程可以发现,第一次排序结果是将最小的值放在了左边,

通过这个结果我们可以知道,这个方法的思路是没问题的,

需要注意的是,要把左边排序好的结果进行固定,防止和后面的值进行交换,

有了这个思路就好办了,只要在下一遍循环的时候,不与排序好的进行比较就行了,代码如下:

for (int i = 0; i < arr.length; i++) {
            for (int j = i; j < arr.length - 1; j++) {
                if (arr[i] > arr[j + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

这里将 i?的值赋给 i 让每次开始时从排序好的下一位开始比较与i同步,这里的?arr[i] > arr[j + 1]?是让arr[i] 跳过与自己比较,减少代码的循环次数,更加高效,要注意 内层循环条件,要改成 j<arr.length-1? 不然会报错,数组下标溢出数组长度。

文章来源:https://blog.csdn.net/m0_59399997/article/details/135640362
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。