package demo_bubble_sort;
//想象数组是垂直的存储在计算机中,底部 值较小的元素像气泡一样浮上去
public class shunxubiao {
// 定义一个用于排序的顺序表结构
int length;// 用于记录顺序表的长度
int[] l = new int[length + 1];// 用于存储排序数组,长度加一就把下标和顺序统一,更好理解。
public shunxubiao(int a,int[]b) {
// TODO 自动生成的构造函数存根
this.length = a;
this.l = b;
}
}
package demo_bubble_sort;
/**
* 冒泡排序:一种交换排序,它的基本思想是:两两比较相邻记录的关键字, 如果反序则交换,直到没有反序的记录为止 * @author wu_pc
*
*/
public class Bubble {
// 初级版
public static void BubbleSort0(shunxubiao a) {
// 比较顺序表中的元素,第一个和后面的每一个进行比较,如果发现比第一个小的数,交换位置
// 内层循环结束,顺序表的第一位已经是最小的数了,外层循环i加一,第二个数开始比较
int i, j;
for (i = 1; i < a.length; i++) {
for (j = i + 1; j <= a.length; j++) {
// 如果比较的数比被比较的大
if (a.l[i] > a.l[j]) {
// 交换两个元素
int p = a.l[i];
a.l[i] = a.l[j];
a.l[j] = p;
}
}
}
}
public static void BubbleSort1(shunxubiao a) {
// 刚才那一种是从上往下比较,从数组的第一个元素开始比较,这种是从下往上比较
// 可以从图片上看出,在第一次内层循环结束后,我们不仅将1移到了第一位,还将2移到了第三位
// 当上万条数据排序时,这种差异会显现出来
int i, j;
// 外层循环一次,数组头部的一位就不再比较了
for (i = 1; i < a.length; i++) {
// 数字像气泡一样浮上去
for (j = a.length - 1; j >= i; j--) {
if (a.l[j + 1] < a.l[j]) {
// 交换两个元素
int p = a.l[j + 1];
a.l[j + 1] = a.l[j];
a.l[j] = p;
}
}
}
}
public static void BubbleSort2(shunxubiao a) {
// 当一个 {2,1,3,4,5}的数组比较时,当1和2交换后,已经是有序数组了,没有再比较的必要
// 可以理解为当有一次循环,没有数据交换,这个数组已经有序了
int i, j;
boolean flag = true;// 定义一个标志位
// &&与,当左右两边都为真时,表达式为真
// 当flag为flase时(没有数据交换),退出循环(不再进行比较)
for (i = 1; i < a.length && flag; i++) {
flag = false;
for (j = a.length - 1; j >= i; j--) {
if (a.l[j + 1] < a.l[j]) {
// 交换两个元素
int p = a.l[j + 1];
a.l[j + 1] = a.l[j];
a.l[j] = p;
flag = true;
}
}
}
}
// 本文思路都来自大话数据结构,原书为C语言实现,在用JAVA语言实现过程中加深了理解,但是记忆程度还是不够深刻
// 自己完全背写可能会卡住,还得不断学习,励志前行,永远不晚,在写代码的过程中找到了书中的一个错误
public static void main(String[] args) {
int[] a = { 0, 4, 3, 1, 2, 0, 4, 7, 8799, 75, 225, 25328, 9, 998, 5, 6, 5 };
shunxubiao c = new shunxubiao(16, a);
BubbleSort2(c);
for (int i = 1; i <= c.length; i++) {
System.out.println(c.l[i]);
}
//调试用代码,可能数据量不够大,几种排序函数用System类下获取时间方法计算后没有区别,没有贴出
}
}