冒泡排序是比较简单的一种排序算法,该算法核心思想是队列中大的元素后冒泡一样被推送到队列的顶部。
算法描述
- 比较待排序队列中相邻的两个元素,如果前一个元素大于后一个元素,则交换两个元素的位置;
- 对队列中所有相邻的元素重复步骤1中的操作,遍历一遍后,最大的元素会被交换到队列的顶端;
- 除了被交换到最后的最大元素,其他未完成排序的元素重复步骤2。同理会将次最大的元素交换到未排序元素的队列顶端;
- 重复以上步骤,知道排序完成。
动态演示
算法实现
1.冒泡排序
package com.lreis.algorithm.sort;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import com.alibaba.fastjson.JSONArray;
/**
* 冒牌排序算法
*/
public class BubbleSort {
public void sort(List<Integer> items) {
if (items == null || items.isEmpty())
return;
int len = items.size();
for (int i = 0; i < len - 1; i++) {
// 每趟可以完成一个元素的排序
for (int j = 0; j < len - 1 - i; j++) {
if (items.get(j) > items.get(j + 1)) {
int temp = items.get(j);
items.set(j, items.get(j+1));
items.set(j + 1, temp);
}
}
}
}
public static List<Integer> items;
static {
loadData("D:\\data.txt");
}
public static void loadData(String fileName) {
File file = new File(fileName);
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
items = JSONArray.parseArray(buffer.toString(), Integer.class);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != br)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
BubbleSort instance = new BubbleSort();
long curtime = System.currentTimeMillis();
instance.sort(items);
long inteval = System.currentTimeMillis() - curtime;
System.out.println("100000个随机数据排序,冒泡排序所需时长:" + inteval + "毫秒");
//100000个随机数据排序,冒泡排序所需时长:122553毫秒
}
};
2.带标记的冒泡排序
设置标记变量pos用来存储最后一次交换的位置,则pos位置之后的元素都是已经排序完成的。
public void sortWithFlag(List<Integer> items) {
if (items == null || items.isEmpty())
return;
int len = items.size();
int index = len;
while (index > 0) {
int pos = 0;
for (int j = 0; j < index - 1; j++) {
if (items.get(j) > items.get(j + 1)) {
pos = j;
int temp = items.get(j);
items.set(j, items.get(j + 1));
items.set(j + 1, temp);
}
}
index = pos;
}
}
参考文献