给定一个整数数组,数组中有奇数有偶数,对数组进行排序,实现如下功能:
(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;
}
}