冒泡排序/插入排序

学习思路:

  1. 思路讲解
  2. 代码实现

一、冒泡排序

1、通过双重循环,相邻两个数据做对比,通过位置交换使其变得有序

2、时间复杂度:O(n^{2});空间复杂度:O(1)

图片分析

解释:

  1. 外部循环从0开始i
  2. 内部循环从0开始j,完整循环后会将本次最大值放入数组最后,下次循环可忽略相应的尾部数据(length-i-1)
  3. 重复1、2步即可完成排序

代码实现

public class BubbleSort {

	public void sort(int [] items){
		//外部循环
		for (int i = 0;i < items.length; i++){
			//排序终止标识
			boolean flag=false;
			//内部循环,每次循环之后相应的末尾数据就是有序的了,下次循环可忽略
			for (int j = 0; j<items.length-i-1; j++){
				if (items[j]>items[j+1]){
					int temp = items[j];
					items[j] = items[j+1];
					items[j+1] = temp;
					flag = true;
				}
			}
			//如果内部循环没有需要交互的数据那么代表数据已经是有序的了
			if (!flag){
				break;
			}
		}
	}

	public static void main(String[] args) {
		BubbleSort sort = new BubbleSort();
		int [] items={3,2,5,1,8,7,4,6};
//		int [] items={9,8,7,6,5,4,3,2,1};
//		int [] items={1,2,3,4,5,6,7,8,9};
		sort.sort(items);
		System.out.println(JSON.toJSONString(items));
	}

时间复杂度:最好的情况就是完全有序的情况下为:O(n)

空间复杂度:冒泡数据交换算法只会有一个内存占用:O(1)

二、插入排序

1、外部循环从下标为1的数据开始往后循环(因为要将小的放当前数的前面,所以0没有对比的)

2、内循环从外循环的当前数据依次往前循环对比

3、如果当前值比前一个值小则往前移动

图片分析

解释:

  1. 外层循环从1开始
  2. 将当前值(1的位置)提出作为基准值对比
  3. 内层循环从1往前与基准值对比,如果大于基准值,将对比值往后移动(对标图第二行)
  4. 如果小于将基准值放入移动后空出的位置(对标图第三行)
  5. 依此循环完毕

代码实现

public class InsertionSort {

	public void sort(int [] items){
		//外层循环从1开始,0无需往前对比
		for (int i = 1 ;i < items.length ; i++){
			//将要对比的基准值放入临时字段
			int temp = items[i];
			//内层循环从外层循环开始值往前循环和基准值对比
			int j = i-1;
			for (;j>=0;j--){
				//往前循环对比,如果比基准值大,则后移动(基准值的位置是空的)
				if (items[j]>temp){
					items[j+1] = items[j];
				}else {
					break;
				}
			}
			//将基准值插入到空出的位置
			items[j+1] = temp;
		}
	}

	public static void main(String[] args) {
		InsertionSort sort=new InsertionSort();
				int [] items={6,3,7,2,4,5,1,9,8};
//				int [] items={9,8,7,6,5,4,3,2,1};
//		int [] items={1,2,3,4,5,6,7,8,9};
		sort.sort(items);
		System.out.println(JSON.toJSONString(items));
	}
}

公众号主要记录各种源码、微服务技术栈,帮忙关注一波,非常感谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值