Algorithm-排序算法-冒泡排序

冒泡排序是比较简单的一种排序算法,该算法核心思想是队列中大的元素后冒泡一样被推送到队列的顶部。

算法描述

  1. 比较待排序队列中相邻的两个元素,如果前一个元素大于后一个元素,则交换两个元素的位置;
  2. 对队列中所有相邻的元素重复步骤1中的操作,遍历一遍后,最大的元素会被交换到队列的顶端;
  3. 除了被交换到最后的最大元素,其他未完成排序的元素重复步骤2。同理会将次最大的元素交换到未排序元素的队列顶端;
  4. 重复以上步骤,知道排序完成。

动态演示

算法实现

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;
		}
	}

参考文献

 

1.十大经典排序算法(动图演示)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值