java实现冒泡,选择,插入,快速排序

本文介绍了一个Java程序,该程序通过生成指定范围内的随机整数数组并使用不同的排序算法(包括冒泡排序、选择排序和插入排序)对其进行排序来演示排序算法的工作原理。此外,还提供了一种验证排序正确性的方法。
import java.util.Arrays;
public class ArraysSort {
	public static void main(String[] args) {
		//在0-99范围内获取20个随机整数
		int[] data = getRandomArray(20,100);
		System.out.println("排序前:"+Arrays.toString(data));
//		 bubble(data);
//		 select(data);
		insert(data);
//		quick(data);
		System.out.println("排序后:"+Arrays.toString(data));
		System.out.println("是否有序:"+isOrdered(data));
	}
	/**
	 * 判断数组是否有序(从小到大)
	 * @param data
	 * @return
	 */
	private static boolean isOrdered(int[] data){
		for(int i = 0 ;i<data.length - 1;i++){
			if(data[i] > data[i+1]){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 得到长度为length的随机不重复数组
	 * 
	 * @param length 要获取的数据长度 
	 * @param scope	要获取数据的范围[0-scope)
	 * @return
	 */
	public static int[] getRandomArray(int length,int scope) {
		if(length > scope){
			throw new RuntimeException("数据长度不能比数据范围大!");
		}
		int[] data = new int[length];
		Arrays.fill(data, Integer.MAX_VALUE);// 这样即就不会默认为0了
		// 存入0-99的随机不重复数
		for (int i = 0; i < data.length; i++) {
			int temp;
			do {
				temp = (int) (Math.random() * scope);
			} while (contain(data, temp));// 如果该数已经存在,则继续取
			data[i] = temp;
		}
		return data;
	}


	/**
	 * 判断数组中是否包含key
	 * 
	 * @param data
	 * @param key
	 * @return
	 */
	private static boolean contain(int[] data, int key) {
		// data默认为0(上面赋值为Integer.MAX_VALUE),当0跟0比较会错误的判断成包含
		for (int i = 0; i < data.length; i++) {
			if (data[i] == key)
				return true;
		}
		return false;
	}


	// 冒泡排序
	public static void bubble(int[] data) {
		//最后一次不用比
		for (int i = 0; i < data.length - 1; i++) {
			for (int j = 0; j < data.length - 1 - i; j++) {
				if (data[j] > data[j + 1]) {
					int temp = data[j];
					data[j] = data[j + 1];
					data[j + 1] = temp;
				}
			}
		}
	}


	// 选择排序
	public static void select(int[] data) {
		int min;
		//最后一个数不用排序
		for (int i = 0; i < data.length - 1; i++) {
			int k = i;
			min = data[i];
			for (int j = i; j < data.length; j++) {
				if (data[j] < min) {
					min = data[j];
					k = j;
				}
			}
			int temp = data[i];
			data[i] = data[k];
			data[k] = temp;
		}
	}


	// 插入排序
	public static void insert(int[] data) {
		// 第一个数不用动
		for (int i = 1; i < data.length; i++) {// 从第二个数开始,要比较的数
			for (int j = 0; j < i; j++) {// 被比较的数
				if(data[i] <data[0]){//插入在左边,第0到i-1的数移到i
					int temp = data[i];
					for (int k = i - 1; k >= j + 1; k--) {
						data[k + 1] = data[k];
					}
					data[0] = temp;
				}else if (data[i] >= data[j] && data[i] <= data[j + 1]) {// 插在中间(j+1的位置)
					int temp = data[i];
					for (int k = i - 1; k >= j + 1; k--) {// 将j+1到i-1整体后退到,i的位置
						data[k + 1] = data[k];
					}
					data[j + 1] = temp;
				} // else就不用动了
			}
		}
	}
	/**
	 * 快速排序
	 * @param data
	 */
	public static void quick(int[] data){
		quick(data, 0, data.length-1);
	}
	private static void quick(int[] data,int p,int r){
		if(p < r){
			//部分排序
			int q = partSort(data, p, r);
			//q为得到的中间值,此时左边的数 < data[p],右边的数 > data[p]
			//递归排序左边
			quick(data, 0, q-1);
			//递归排序右边
			quick(data, q+1, r);
		}
	}
	private static int partSort(int[] data,int p,int r){
		int i = p-1;
		for(int j = p ;j<=r-1;j++){
			//此时i+1记录着比data[r]大的数,是准备要换位置的,换掉位置之后(小的数倍换来)
			//即i又向前进一格,继续记录着i+1的大数的最左边的位置。这个位置到到达最后的
			//时候会跟data[r]key换掉,即现在进变成了左边是小于key的数,右边是大于key的数
			if(data[j] <= data[r]){
				i++;
				change(data,i,j);
			}
		}
		change(data, i+1, r);
		return i+1 ;
	}
	private static void change(int[] data,int x,int y ){
		if(x == y){//相同的不换,节约时间
			return ;
		}
		int temp = data[x];
		data[x] = data[y];
		data[y] = temp;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值