`
mamaoyuan625
  • 浏览: 172729 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

冒泡排序

阅读更多
/**
 * 冒泡排序算法
 * @author WangZhen
 */
package test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

public class BubbleSort {

	public static void main(String[] args) {
		int c = 0;
		Random random = new Random();
		Set<Integer> set = new HashSet<Integer>();
		while (set.size() < 10) {
			set.add(random.nextInt(10));
		}
		System.out.println("生成1到10个不重复的数:");
		
		Iterator<Integer> it = set.iterator();
		while (it.hasNext()) {
			c++;
			if(c%20 ==0){
			System.out.print(it.next() + ",\n ");
			}
			else{
				System.out.print(it.next() + ", ");
			}
		}




		Integer[] values = (Integer[]) set.toArray(new Integer[set.size()]);
		System.out.println("\n升序冒泡排序算法:");
		sortAsc(values);
		c=0;
		for (Integer i : values) {
			c++;
			if(c %20==0){
				System.out.print(i + ",\n");
			}else{
			System.out.print(i + ", ");
			}
		}
		System.out.println("\n降序冒泡排序算法:");
		c=0;
		sortDesc(values);
		for (Integer i : values) {
			c++;
			if(c %20==0){
				System.out.print(i + ",\n");
			}else{
			System.out.print(i + ", ");
			}
		}
	}

	public static void sortAsc(Integer[] values) {
		for (int i = 0; i < values.length; ++i) {
			for (int j = 0; j < values.length - i - 1; ++j) {
				if (values[j] > values[j + 1]) {
					int temp = values[j];
					values[j] = values[j + 1];
					values[j + 1] = temp;
				}
			}
		}
	}

	public static void sortDesc(Integer[] values) {
		for (int i = 0; i < values.length; i++) {
			for (int j = 0; j < values.length - i - 1; j++) {
				if (values[j] <= values[j + 1]) {
					int temp = values[j];
					values[j] = values[j + 1];
					values[j + 1] = temp;
				}
			}
		}
	}
}

 结果:

生成1到10个不重复的数:
2, 4, 8, 9, 6, 1, 3, 7, 5, 0, 
升序冒泡排序算法:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
降序冒泡排序算法:
9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 
对于效率问题:有一种方法 但是和上面的相差很微小 

 

/**
	 * 冒泡排序实现原理:把数组分为无序区和有序区,起始全部为无序区 
	 * 对于无序区依次比较大小,将较大(或较小)的提前 
	 * 每趟最后一次交换的位置就是有序区起点
	 * 由于无序区也有可能已经有序,所以每趟遍历完毕将有序区起始点清零 
	 * 如果没有交换的元素说明已经排序完毕 每趟遍历只需达到有序区之前就可
	 */
	public static void sortAsc(Integer[] values) {
		int flag = values.length - 1; // 有序区起始点
		while (flag > 0) {
			int index = flag; // 临时保存有序区起点
			flag = 0; // 将有序区起点清零
			for (int i = 0; i < index; ++i) {
				if (values[i] > values[i + 1]) {
					int temp = values[i]; // 交换数据
					values[i] = values[i + 1];
					values[i + 1] = temp;
					flag = i; // 如果发生元素交换就更新起始点
				}
			}
		}
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics