1.0 概述
-
交换排序的基本思想是
两两比较
待排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。 -
交换排序主要方法(这一次主要讲解冒泡排序):
-
冒泡排序
-
快速排序
-
2.0冒泡排序
- 概述
-
冒泡排序:Bubble Sort
-
将待排序的数组看成从上到下的存放,把关键字较小的记录看成==较轻的==,关键字较大的记录看成==较重的==,
-
较小关键字值的记录,好像水中的气泡一样,向上浮;
-
较大关键字值的记录,好像水中的石块一样,向下沉;
-
当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。
2.1 示意图(方便更加容易理解) 
2.2 算法分析
-
从第一个记录开始,依次对无序区中相邻记录进行关键字比较,如果大在上,小在下,则交换,第一趟扫描下来表中最大的沉在最下面
-
然后再对前n-1个记录进行冒泡排序,直到排序成功为止。
-
一般,第i趟扫描时,r[0]到r[n-i]和r[i+1]到r[n-1]分别为当前的无序区和有序区。
-
例如拿 {52,39,67,95,70,8,25,52} 做例子
2.3算法:标准版
public void bubbleSort() {
RecordNode temp;
for(int i = 1 ; i < this.curlen; i ++) { //每一趟需要处理好一个数据
for(int j = 0; j < this.curlen - i ; j ++) { //处理到无效序列的倒数第二位
if(r[j].key.compareTo(r[j+1].key) > 0) { //交换相邻的2个元素
temp = r[j];
r[j] = r[j+1];
r[j + 1] = temp;
}
}
}
}
2.4算法:优化版【重点】
//【算法优化】 冒泡排序算法
public void bubbleSort() {
// System.out.println("冒泡排序");
RecordNode temp; // 辅助结点
boolean flag = true; // 是否交换的标记
for (int i = 1; i < this.curlen && flag; i++) { // 有交换时再进行下一趟,最多n-1趟
flag = false; // 假定元素未交换
for (int j = 0; j < this.curlen - i; j++) { // 一次比较、交换
if (r[j].key.compareTo(r[j + 1].key) > 0) { // 逆序时,交换
temp = r[j];
r[j] = r[j + 1];
r[j + 1] = temp;
flag = true; //如果发生交换,记录
}
}
System.out.print("第" + i + "趟: ");
display();
}
}
3.0 测试
public static void main(String[] args) throws Exception {
int[] arr = {52,39,67,95,70,8,25,52};
SeqList seqList = new SeqList(arr.length);
for (int i = 0; i < arr.length; i++) {
seqList.insert(i, new RecordNode(arr[i]));
}
// 希尔排序算法
seqList.bubbleSort();
}
//冒泡排序
//第1趟: 39 52 67 70 8 25 52 95
//第2趟: 39 52 67 8 25 52 70 95
//第3趟: 39 52 8 25 52 67 70 95
//第4趟: 39 8 25 52 52 67 70 95
//第5趟: 8 25 39 52 52 67 70 95
//第6趟: 8 25 39 52 52 67 70 95