本帖最后由 老旭谈IT 于 2017-12-22 21:15 编辑
基于很多同学在面试的过程中被问到一些基础的算法,导致整个面试过程不理想,而基础的算法和数据结构往往都是一些大公司任职的基本要求,这也严重影响拿offer的成功率。接下来的一段时间我将陆续对一些简单的基础的算法和数据结构进行详细说明。我将从排序算法说起,下面从冒泡排序开始说起。 排序结果:数据从小到大。 首先说一下冒泡排序的思想:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右数据。继续比较。一次比较结束出现一个最大值在最后一个位置。 思想就是代码的体现,掌握思想写代码66的。 我以5个数据为例集合冒泡排序的思想进行图解说明。
数据为 8、5 、2 、6 、1。
第一次比较过程如下:
简单说明:
每次比较从第一个数据开始,也就是8开始。数据两两比较,也就是8和5进行比较。如果左边数据比右边数据大,则交换左右数据,也就是8比5大,8和5的位置交换。继续比较,也就是交换位置后,8继续和后面的数据比较。当最大值8出现在了最后一个位置时,第一次比较结束。当下一次比较,8已经是最大值就没必要参与比较。 第二次比较过程如下:
简单说明:第二次比较过程和第一次比较过程是一致的,第二次比较最大值6出现在最后一个位置。下一次比较,最大值6不参与比较。 第三次比较过程如下:
简单说明:第三次比较最大值5出现最后一个位置,下次比较,5不参与比较。 第四次比较过程如下:
简单说明:第四次比较最大值2出现最后一个位置。至此,所有数据排序过程结束。 文字与图理解完毕,直接上代码演示。 [Java] 纯文本查看 复制代码 public static void main(String[] args) {
// 定义10个数据的数组
int data[] = new int[10];
// 初始化数组
initData(data);
// 打印排序前数组数据
print(data);
// 冒泡排序
bubbleSort(data);
// 打印排序后的数组数据
print(data);
}
/**
* 冒泡排序:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右数据。继续比较。一次比较结束出现一个最大值在最后一个位置。
*
* @param data
*/
private static void bubbleSort(int[] data) {
// 比较的是次数
for (int i = data.length - 1; i > 0; i--) {
// 每次比较冒泡的过程(查找最大值的过程),每次从第一个数据开始,因此j每次都是从零开始。
//从图解中可以看出,随着比较次数的增多,冒泡的过程逐渐减少,因此i的值是随着比较的次数增多而减少。
//反推i的初始值为最大,又由于5个数据比较次数为4次,可得出i的初始值为数据个数-1。
for (int j = 0; j < i; j++) {
// 数据交换
if (data[j] > data[j + 1]) {
// 交换
int temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
}
// 该方法随机生成1-100的随机数
private static void initData(int[] data) {
for (int i = 0; i < data.length; i++) {
data[i] = (int) Math.ceil(Math.random() * 100);
}
}
// 该方法用于打印数组数据
private static void print(int[] data) {
System.out.print("[");
for (int i = 0; i < data.length; i++) {
if (i != data.length - 1) {
System.out.print(data[i] + ",");
} else {
System.out.println(data[i] + "]");
}
}
}
下一篇:选择排序详解,敬请期待………….. |