JAVA排序之木桶排序 和 冒泡排序

/**
 * 功能:排序练习
 * 
 * @author eric (imphp[at]qq[dot]com)
 */
package com.sort;

import java.util.*;

public class Demo1 {

	public static void main(String[] args) {
		Random random = new Random(100);
		int[] arr = random.getRandom();
		Bubble bubble = new Bubble(arr);
		bubble.show();
		
		/*
		 * 木桶排序
		int[] a = { 3, 1, 2, 3, 4 };
		Bucket bucket = new Bucket(a);
		bucket.show();
		*/
	}
}

/**
 * 排序
 */
interface Sort {
	public void show();
}

/**
 * 冒泡排序法 老牌的排序法了
 * 外层为循环次数,内层为循环元素判断大小
 * 效率很低的排序 O=(N*N)
 * 
 */
class Bubble implements Sort {
	int[] arr = null;
	
	public Bubble(int[] arr) {
		this.arr = arr;
	}
	
	public void show()
	{
		int tmp = 0;
		// 循环最外层,意味着需要循环多少次,例:5个元素 只需循环4次即可,最后一次不需要循环
		for (int i=0; i<this.arr.length-1; i++) {
			
			// 循环里面的元素,同时排序,每次循环的次数为 最外层循环次数-该层 例:5个元素 第二次外部循环为 4-2=2次
			// 为什么内层循环为 外层循环次数-该层呢?
			// beacuse: 外层循环一次,确定一个元素的位置 ,内层循环的数组中就可以少确定一个元素,故而
			// 内层循环次数 = 外层循环次数-该层数
			for (int j=0; j<this.arr.length-1-i; j++) {
				if (this.arr[j] > this.arr[j+1]) {
					tmp = this.arr[j];
					this.arr[j] = this.arr[j+1];
					this.arr[j+1] = tmp;
				}
			}
		}
		
		for (int i=0; i<this.arr.length; i++) {
			System.out.println(this.arr[i]);
		}
		
	}
}

/**
 * 桶排序 将带排序的数组 定位 K = [1,3,5,1,4] 创建一个木桶,每一个元素可以和对应的数组元素一一对应,每次出现一个元素,则在木桶的相应内容中
 * +1 最后循环木桶,打印次数为 对应木桶的值 即可
 * 
 * 
 * @author
 */
class Bucket implements Sort {
	int[] arr = null;

	public Bucket(int[] arr) {
		this.arr = arr;
	}

	/**
	 * 输出循环值 算法思想: 创建一个空数组,元素初始值都为0,循环排序的数组,遇到0.
	 * 
	 */
	public void show() {

		// 创建一个木桶
		int[] bucket = new int[5];

		// 循环待排序数组,如果数组值等于木桶的下标,则对应的木桶值+1
		for (int i = 0; i < this.arr.length; i++) {
			bucket[this.arr[i]] += 1;
		}

		// 循环木桶,打印出各个值
		for (int i = 0; i < bucket.length; i++) {
			for (int j = 1; j <= bucket[i]; j++) {
				System.out.println(this.arr[i]);
			}
		}

	}
}

/**
 * 生成随机数
 */
class Random {

	// 生成多少个 默认5个吧
	int num = 5;

	// 生成多少位以内的 默认10位
	int length = 0;

	public Random(int length) {
		this.length = length;
	}

	public Random() {
		this.length = 5;
	}

	/**
	 * 
	 * @return
	 */
	public int[] getRandom() {
		int[] arr = new int[this.num];

		for (int i = 0; i < this.num; i++) {
			arr[i] = (int) (Math.random() * this.length + 1);
		}

		return arr;
	}

	/**
	 * 打印数组
	 */
	public void show(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.println("数组元素" + arr[i]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值