Java基础 浅谈冒泡选择 排序
2017-02-28 本文已影响0人
白衬衫少年
“简单不先于复杂,而是在复杂之后.” —— Alan Perlis

序言
冒泡排序
冒泡排序是七大排序算法中较为简单的一个,它的时间复杂度为O(n^2),相较于快速排序,它的耗时较长,但是不会带来额外的空间开销(快速排序对栈的需求),因此它适用于数据量较小且对时间要求不高的业务,然而在实际使用过程中,几乎遇不到这种情况,所以冒泡排序极少被使用,但是作为一个基础的入门排序算法,他的算法思想还是十分值得我们去学习的.

冒泡排序核心思想
冒泡排序的思想十分简单,它是依据气泡在水中不断上浮的灵感设计出来的:每次冒泡排序都是从头到尾,依次将紧挨着的两个数进行比较,如果前者比后者大,就交换两者的位置,否则不操作,直至末尾,比如先判断第一个和第二个的数,如果第一个比第二个大,就将两者交换,再接着判断第二个和第三个,以此类推,这样就达到了将最大的数放在最后面的效果,也就是将最大的数成功放在了它正确的位置上,之后再对前面的序列重复本操作,直到所有数都找到了自己正确的位置为止(正确的位置指的是排序之后它在序列中的位置)。

简单的例子

动画演示


代码
// 冒泡排序
//定义一个数组 包含n个元素
int[] arr2 = {5,8,4,2,7};
//定义i用于 外循环的变量
//外层循环控制值冒泡排序比较的趟数,一共比较 数组长度(arr2.length) - 1 趟
for (int i = 0; i < arr2.length - 1; i++) {
//定义j用于内层循环的变量
//内层循环控制一趟比较的次数,每比较一趟要比上一次比较的次数少1次,因为上一趟比较已经目标元素排在数组的最后一个
for (int j = 0; j < arr2.length - i - 1; j++) {
if (arr2[j] > arr2[j + 1]) {
int temp = arr2[j];
arr2[j] = arr2[j+1];
arr2[j+1] = temp;
// 每当 当前数组值arr2[j] 大于后面a[j+1]元素的值, 对两个值进行交换,引用间变量temp来实现两个数组值的互换
}
}
}
for (int i:arr2) {
System.out.println(i);
}

选择排序
选择排序核心思想
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。

动画演示


代码
int[] arr1 = {5,2,3,6,1};
// 选择排序
for (int i = 0; i < arr1.length - 1; i++) {
// 第i趟 -- a[i]后所有的数据和a[i]比较
for (int j = i + 1; j < arr1.length; j++)
{
//找到a[i] ~ a[length - 1中最小的数与a[i]进行交换
if (arr1[i] > arr1[j])
{
int temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
}
}
}
// 增强循环 类似于 iOS的 for in遍历
for (int i:arr1) {
System.out.println(i);
}
