排序算法入门

1.冒泡排序

冒泡排序可以说是排序算法中最为简单的一种。
核心思想: 相邻元素做比较,两两比较小靠前。
1.将相邻的两个元素进行比较,比较完后,按照元素大小进行移位,小的移动到前面,大的移动到后面。
2.每一轮比较完后,“最大的元素” 将被移位到最后。在下一轮比较的时候,这个 “最大的元素” 就不需要再参与比较了。
3.重复进行上述步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)
原数 9, 7, 8, 6, 2
第一轮:
9 7比较 7 9 变成 7 9 8 6 2
9 8比较 8 9 变成 7 8 9 6 2
9 6比较6 9 变成 7 8 6 9 2
9 2比较 2 9 变成 7 8 6 2 9
第二轮:
7 6 2 8 9
第三轮:
6 2 7 8 9
第四轮:
2 6 7 8 9

原数 9, 7, 8, 6, 2 一共5个数 比较4轮 也就是外层循环
第一轮 比较4次 第二轮 比较3次,也就是内层循环

int[] arr = { 9, 7, 8, 6, 2 };
//外层循环 循环的轮数
		for (int i = 0; i < arr.length - 1; i++) {
			 // - 1 是为了防止数组遍历出现:下标越界异常
		    // - i 是为了排除上一轮比较的最大元素
		    //内层循环 循环的次数
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}

输出[2, 6, 7, 8, 9]

2. 选择排序

1.第一次比较的时候,先将 “第一个元素” 假定为最小元素值。
2.然后将第一个元素依次和后面的所有元素进行比较大小,如果后面的元素比第一个元素小,则进行交换。
3.每一轮比较完后,“最小的元素” 将被移位到 “第一个元素位置”。在下一轮比较的时候,这个 “最小的元素” 就不需要再参与比较了。
4.重复的进行上面步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)

原数:9, 7, 8, 6, 2
第一轮: 2 9 8 6 7
9, 7 变成 7 9 8 6 2
7 8 变成 7 9 8 6 2
7 6 变成6 9 8 7 2
6 2变成 2 9 8 7 6
第二轮 26987
2 9 8 7 6
9 8 变成 28976
8 7 27986
7 6 26987
第三轮 26798
第四轮26789

		int[] arr = { 9, 7, 8, 6, 2 };
		for (int i = 0; i < arr.length-1; i++) {
			 // 初始值 i + 1 是为了排除自己和自己比较的问题(第一个元素要和第二个元素开始比较)
			//内层循环 比较的是每轮获取到的数据
			for (int j = i+1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}

输出[2, 6, 7, 8, 9]

3.插入排序

1.首先将第一个元素就看作是一个已经排序好的数列,后面的其他元素则看作未排序数列。

2.然后将第二个元素在已经排序好的数列中,做插入动作。即在已经排序好的数列中,从后向前依次查找符合升序规律的位置,并插入到该位置。

int[] arr = { 9, 7, 8, 6, 2 };
		for (int i = 0; i < arr.length - 1; i++) {
			//j--是因为只和前面的比较排序
			for (int j = i + 1; j > 0; j--) {
				 // 在有序数列中查找位置做插入,并保持有序。
				if (arr[j] < arr[j - 1]) {
					int temp = arr[j - 1];
					arr[j - 1] = arr[j];
					arr[j] = temp;
				}
			}
			System.out.println(Arrays.toString(arr));
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值