基本思想
核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解。
实现
把数组从中间划分成两个子数组,一直递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素,才开始合并排序。
分解左右并排序
2020/7/15大约 3 分钟
基本思想
核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解。
实现
把数组从中间划分成两个子数组,一直递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素,才开始合并排序。
分解左右并排序
在冒泡排序中,经过每一轮的排序处理后,数组后端的数是排好序的;而对于插入排序来说,经过每一轮的排序处理后,数组前端的数都是排好序的。
基本思路:当迭代到i时,会向前比较,插入到合适的位置(去在线算法演示体会)。
Java代码
public void insertionSort(int[] nums) {
for (int i = 1; i < nums.length; i++) {
for (int j = i; j >= 1; j--) {
if (nums[j-1] < nums[j]) {
break;
}
int tmp = nums[j-1];
nums[j-1] = nums[j];
nums[j] = tmp;
}
}
}
冒泡排序是非常简单的一种排序,我们只需求知道他是怎样交换的就可以了。
基本规则:从左到右依次比较,把最大的数放到右边,依次迭代(先是保证末端排好,再向前迭代)。可以找个“在线算法演示”进行体会。
Java代码
public void bubbleSort(int[] nums) {
for (int i = 0; i < nums.length-1; i++) {
for (int j = i; j < nums.length-1; j++) {
if(nums[j] > nums[j+1]) {
int tmp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = tmp;
}
}
}
}