冒泡排序、选择排序

冒泡排序、选择排序

冒泡排序

冒泡排序重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

  1. 比较相邻的两个元素,如果第一个比第二大,就交换位置
  2. 对每一对相邻的元素做同样的工作,从开始一对到最后一对,当一轮比较完之后,最后的元素,一定是最大的(最小的)
  3. 针对所有的元素,重复执行上面操作,除最后一个元素
  4. 持续每次需要比较的队伍越来越少,一直到没有任何一对需要比较,终止

需要两层循环,外层循环宏观控制,遍历每一个元素,内层循环控制相邻变量的交换,执行完一次找到最大(小)的元素,并放在合适的位置,最终完成排序。

public static void bubbleSort(int[] a) {
	//决定循环次数(每一轮比较作为一次循环)
	for (int i = 0; i < a.length-1; i++) {
		//决定每次内层循环的次数
		//外层循环每执行完一次,都会把最大的元素放在最后面,所以最后一个元素不需要进行比较,因此每次内层循环的次数递减
		for (int j = 0; j < a.length-1-i; j++) {
			//比较相邻的元素
			if (a[j]>a[j+1]) {
				//交换位置,使用异或方法进行交换,也可以使用中间变量方法进行交换
				a[j+1] = a[j+1]^a[j];
				a[j] = a[j+1]^a[j];
				a[j+1] = a[j+1]^a[j];
			}
		}
	}
}

选择排序

每次都把最小的/最大的放到最左边。先拿出第一个,假设是最小的,然后挨个和后面的比较,全部比较完之后,如果有比这个元素小的,就换位。

	public static void selectSort(int[] a){
		int min;
		for (int i = 0; i < a.length; i++) {
			//每一次循环假设下标为i的元素为最小值
			min = i;
			//因为i是当前元素,要和后面的比较,就要从i+1开始比较
			//这里一定不能写0,否则结果错误
			for (int j = i+1; j < a.length; j++) {
				//判断min是否为最小值
				if (a[min]>a[j]) {
					//如果是最小值,则将下标为j赋值给min
					min = j;
				}
			}
			if(min != i){
				a[i] = a[i]^a[min];
				a[min] = a[i]^a[min];
				a[i] = a[i]^a[min];
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值