冒泡排序拓展实例

本文介绍了一种特殊的排序需求,要求奇数在前偶数在后且奇数和偶数内部顺序不变。通过对冒泡排序的分析,提出了解决方案,并详细解释了排序过程。最终给出了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数数组,数组中有奇数有偶数,对数组进行排序,实现如下功能:

(1)奇数在前,偶数在后

(2)奇数之间的排序以及偶数之间的排序和原来一样

(3)时间复杂度是O(n)

如下数组:[3,1,2,4,5,6,7],要求排序之后为[3,1,5,7,2,4,6]。

分析:第(1)和第(2)说明类似于数组大小排序,不同之处在于这个是奇数偶数排序。第(3)要求时间复杂度是O(n),经典排序算法时间复杂度为O(n)的有冒泡排序,插入排序。

冒泡排序的原理:一组数据,一次比较两个相邻的元素,如果第一个元素小于第二个元素则交换顺序,否则下标自增,比较下两个元素,每次遍历都可以确定未拍好序的元素中的最大的那个。n次遍历就得到一个有序数组。每次遍历都从第一个元素开始,遍历到未排序的最后一个元素。

插入排序的原理:基于一个有序数组,通过从后向前的遍历方式确定新增元素的位置。需要将已排好序的元素逐个向后移。

分析问题:该问题类似于冒泡排序,排序过程如下:从第一个元素开始访问,

       如果当前元素是奇数:看当前元素前一个元素是奇数还是偶数。

               如果当前元素前面没有其他元素:则执行下一次循环。

               如果当前元素前面有其他元素:如果前一个元素是奇数,则不变,执行下一次循环;

                                                                 如果前一个元素是偶数,则交换,再比较前一个元素与前前一个元素;

      如果当前元素是偶数:执行下一次循环。

排序过程如下:第一个元素是3,奇数,3之前没有其他元素,执行下一次循环。

                         第二个元素是1,奇数,1之前是3,是奇数,执行下一次循环。

                         第三个元素是2,偶数,执行下一次循环。

                         第四个元素是4,偶数,执行下一次循环。

                         第五个元素是5,奇数,5之前是4,是偶数,交换位置,数组变为[3,1,2,5,4,6,7];现在第四个元素变为5,奇数,5之前是2,是偶数,交换位置,数组变为[3,1,5,2,4,6,7];现在第三个元素变为5,奇数,5之前是1,是奇数,执行下一次循环。

                         第六个元素是6,偶数,执行下一次循环。

                         第七个元素是7,奇数,7之前是6,偶数,交换位置,数组变为[3,1,5,2,4,7,6];现在第六个元素变为7,奇数,7之前是4,是偶数,交换位置,数组变为[3,1,5,2,7,4,6];现在第五个元素变为7,奇数,7之前是2,是偶数,交换位置,数组变为[3,1,5,7,2,4,6];现在第四个元素变为7,奇数,7之前是5,是奇数,执行下一次循环。

代码实现如下:

package algorithm;

public class BubbleSort {

    public static void main(String[] args) {
        int[] array = new int[]{3, 1, 2, 4, 5, 6, 7};
        array = sort(array);
    }

    public static int[] sort(int[] array) {
        for (int i = 0; i < array.length; i++) {//控制每次循环的起始位置,第一次从3开始,第二次从1开始,第三次从2开始...因为第一次循环之后,第一个元素已经排好序;第二次循环之后,前两个元素已经排好序...
            for (int j = i; j > 0; j--) {//如果当前遍历的元素是偶数,则执行下一次循环;如果当前遍历的元素是奇数,如果它的前一个元素是偶数,就交换位置,如果它的前一个元素是奇数,则跳出内存循环,开始下一个外层循环
                if (array[j] % 2 != 0) {
                    if (array[j - 1] % 2 == 0) {
                        int temp = array[j];
                        array[j] = array[j - 1];
                        array[j - 1] = temp;
                    } else {
                        break;
                    }
                }
            }
        }
        return array;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值