1.最朴素的冒泡排序
每一轮都从索引1开始,和他的前一位进行比较,比较完一轮end–,即内层要比较的元素的索引边界减1.
protected void sort() {
for (int end = array.length - 1; end > 0; end--) {
for (int begin = 1; begin <= end; begin++) {
// if (array[begin] < array[begin - 1]) {
if (cmp(begin, begin - 1) < 0) {
swap(begin, begin - 1);
}
}
}
}
第一步优化
如果发现有一轮比较没有依次进行交换,就说明序列已经有序,直接退出循环。
protected void sort() {
for (int end = array.length - 1; end > 0; end--) {
boolean sorted = true;
for (int begin = 1; begin <= end; begin++) {
// if (array[begin] < array[begin - 1]) {
if (cmp(begin, begin - 1) < 0) {
swap(begin, begin - 1);
sorted = false;
}
}
if (sorted) break;
}
}
** 第二步优化**
- 每一轮比较结束之后,找到最后一次交换元素的索引,赋值给end,下一次外层循环end减1,就直接到了前一个未进行比较的元素。即下一轮的比较边界就可能变小,提前结束。进行下一轮比较。
- 他也包含第一步优化的那个提前结束的情况,如果下一轮循环时发现序列已经有序,就直接把sortedIndex = 1赋值给end,结束外层循环。
protected void sort() {
for (int end = array.length - 1; end > 0; end--) {
int sortedIndex = 1;
for (int begin = 1; begin <= end; begin++) {
// if (array[begin] < array[begin - 1]) {
if (cmp(begin, begin - 1) < 0) {
swap(begin, begin - 1);
sortedIndex = begin;
}
}
end = sortedIndex;
}
}