桶排序,选择排序,冒泡排序,插入排序的Java实现

package sort;
//定义接口,控制小到大排序,或者大到小排序
public interface Compare {
	boolean compareTo(int a, int b);
}

package sort;
//排序工具类
public class ArraySortUtil {
	/**
	 * 冒泡排序
	 * 
	 * @param a 排序的目标数组
	 * @param c 比较函数,决定数组的排序规则
	 * @return 返回排序好的数组
	 */
	public static int[] bubbleSort(int[] a, Compare c) {

		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a.length - i - 1; j++) {
				if (c.compareTo(a[j], a[j + 1])) {
					int t = a[j];
					a[j] = a[j + 1];
					a[j + 1] = t;
				}
			}
		}
		return a;

	}

	/**
	 * 选择排序
	 * 
	 * @param a 排序的目标数组
	 * @param c 定义排序规则的接口,决定排序的规则
	 * @return 返回排序好的数组
	 */
	public static int[] selectSort(int[] a, Compare c) {
		for (int i = 0; i < a.length; i++) {
			int k = i;
			for (int j = i + 1; j < a.length; j++) {
				if (c.compareTo(a[k], a[j])) {
					k = j;
				}
			}
			if (k != i) {
				int t = a[i];
				a[i] = a[k];
				a[k] = t;
			}
		}
		return a;
	}

	/**
	 * 插入排序
	 * 
	 * @param a 排序的目标数组
	 * @param c 定义排序规则的接口,决定排序的规则
	 * @return 返回排序好的数组
	 */
	public static int[] insertSort(int[] a, Compare c) {
		int[] b = new int[a.length + 1];
		for (int i = 0; i < a.length; i++) {
			int j = i - 1;
			while (j > 0 && c.compareTo(b[j], a[i])) {
				b[j + 1] = b[j];
				j--;
			}
			b[j + 1] = a[i];
		}
		return b;
	}

	/**
	 * 桶排序
	 * 
	 * @param a
	 * @param c
	 * @return
	 */
	public static int[] bucketSort(int[] a, Compare c) {
		int max = Integer.MIN_VALUE;
		for (int num : a) {
			max = Math.max(num, max);
		}
		int[] bucket = new int[max + 1];
		for (int i = 0; i < a.length; i++) {
			bucket[a[i]]++;
		}
		int[] b = new int[a.length];
		if (c.compareTo(1, 2)) {
			int pos = 0;
			for (int i = max; i >= 0; i--) {
				if (bucket[i] > 0) {
					while (bucket[i] > 0) {
						b[pos++] = i;
						bucket[i]--;
					}
				}
			}
		} else {
			int pos = 0;
			for (int i = 0; i <= max; i++) {
				if (bucket[i] > 0) {
					while (bucket[i] > 0) {
						b[pos++] = i;
						bucket[i]--;
					}
				}
			}
		}
		return b;
	}
}

package sort;

public class LargeToSmall implements Compare {
//大到小排序
	@Override
	public boolean compareTo(int a, int b) {
		// TODO 自动生成的方法存根
		if (a < b) {
			return true;
		}
		return false;
	}

}

package sort;

public class SmallToLarge implements Compare {
//小到大排序
	@Override
	public boolean compareTo(int a, int b) {
		// TODO 自动生成的方法存根
		if (a > b) {
			return true;
		}
		return false;
	}

}

package sort;
//测试类
public class TestSort {
	public static void main(String[] args) {
		int a[] = new int[] { 1, 3, 2, 5, 4, 8, 7, 6 };
		Compare stl = new SmallToLarge();
		Compare lts = new LargeToSmall();
		System.out.print("Sort before:");
		for (int num : a) {
			System.out.print(num + " ");
		}
		System.out.println("\n");
		// ArraySortUtil.bubbleSort(a, lts);
		// ArraySortUtil.selectSort(a, stl);
		// a = ArraySortUtil.insertSort(a, stl);
		a = ArraySortUtil.bucketSort(a, stl);
		System.out.print("Sorted after:");
		for (int num : a) {
			System.out.print(num + " ");
		}
		System.out.println();

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值