java 冒泡排序 选择排序 插入排序及其异同点

交换两坐标位置的swap()函数 之后要用到

public static void swap(int[] arr, int a, int b) {
		int temp;
		temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

采用空瓶法。交换变量的三种方法 →点这里

冒泡排序

public static void bubbleSort(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					swap(arr, j, j + 1);
				}
			}
		}
	}

将arr.length个数组中的元素按照由小到大排序:
1.从第一个元素(0号元素)开始,比较它(j)和他之后的元素(j+1)的大小并交换,将最大的元素放置在队尾。
2.重复执行1步骤(length - 1)次,每次都将剩余元素中最大的元素放置在剩余元素的队尾。
注意:
第一步执行次数为(length - 1 - j),表示“比较大小”的步骤仅发生在还没有进行过比较的剩余元素中。
外层循环(i循环)的循环次数不是数组长度,而是数组长度 - 1。因为元素两两比较大小只会发生(n - 1)次。类似五个手指头之间有四条手指缝。如果进行i次排序,程序会报错 java.lang.ArrayIndexOutOfBoundsException。

选择排序

public static void selectionSort(int[] arr) {
		int min = 0;
		int flag = -1;

		for (int i = 0; i < arr.length; i++) {
			flag = i;
			min = arr[i];
			for (int j = i; j < arr.length; j++) {
				if (arr[j] < min) {
					min = arr[j];
					flag = j;
				}
			}
			swap(arr, flag, i);
		}
	}

将arr.length个数组中的元素按照由小到大排序:
1.找出length个元素其中最小的数并放在数组的第一个位置(0号位)
2.执行length次1步骤。每次都将剩余元素中最小的数放在剩余元素的第一位。
注意:
每次将剩余元素的第一个元素设定为最小值min,如果之后遇到比第一位更小的元素,则替换最小值,记忆此元素的位置,再继续比较。
每次比较将从上一次比较完成的元素的下一位开始,到队尾结束。

插入排序:
这里提供两种写法

public static void insertSort(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
				swap(arr, j, j - 1);
			}
		}
	}

将arr.length个数组中的元素按照由小到大排序:
插入排序的理解可以类比扑克牌的摸牌阶段(来自我的一位学长)。按照元素在数组中的顺序,先抽取第一个元素捏在手中,再抽取第二个元素即第二张牌,如果第二张牌比第一张牌小,则把第二张插入在第一张牌的前面,如果不比第一张牌小(>或=),则放在第一张牌后面;继续抽取第三张牌,与第二张进行比较,如果比第二张小,则插入在第二张牌的前面,接着比较第三张与第一张牌的大小,如果第三张比第一张小,则插入在第一张前面,如果不比第一张牌小(>或=),则停止继续向前比较;继续抽取第四张牌,依次和前一张牌比较……直到成为第一张牌或不比前一张牌小(>或=)……以此类推。
注意:
插入排序和冒泡排序的不同之处在于:插入排序只要遇到当前元素和它的前一个元素不满足交换的条件(>或<),就立即退出循环(体现在代码 && arr[j] < arr[j - 1] 的判断上),因为之前的数已经排好顺序。而冒泡排序需要两两相互验证条件,每轮挑出剩余元素中最大或最小的那一个。
第二种写法:

		public static void insertSort(int[] arr) {
			for (int i = 1; i < arr.length; i++) {
				for (int j = 0; j < i && arr[i - j] < arr[i - j - 1]; j++) {
					swap(arr, i - j, i - j - 1);
				}
			}
		}

如有错误或有更好的改进意见,欢迎批评指正!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值