冒泡,选择,插入三大基本排序解析以及Demo

面试中被问道每写好,回来写几个Demo加深一下认识

冒泡是一种流行但效率低的算法,具体通过反复交换相邻未排序的元素

算法实现通过经典java 演示进行阐述

//冒泡是一种流行但效率低的算法,反复交换相邻未排序的元素
public class BubbleDemo {
	// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
	int[] a = { 6, 5, 4, 3, 2, 1, 0 };

	public void bubbleSort() {
		for (int i = 0; i < a.length; i++) {
			// 算法设计:
			// 1.初始化:a[0,i]即a[0]有序
			// 2.不变式:a[0,i]有序==>加入a[i+1]即a[j]后,保持a[0,i+1]有序
			// -->实现:通过依次对a[j]<a[j-1]-->a[i,0]比较判断,然后交换位置确保有序
			// 3.终止:a[0,a.length]有序

			// 因为a[0,i]有序,可以将a[j] < a[j - 1]放入for内部,等同于while的条件
			for (int j = i + 1; j > 0 && a[j] < a[j - 1]; j--) {
				int x = a[j];
				System.out.println("x=a[" + j + "]" + "=" + x);
				a[j] = a[j - 1];
				a[j - 1] = x;
			}
			show(a);
		}
	}

	public void show(int a[]) {
		StringBuffer arr = new StringBuffer("[");
		for (int i = 0; i < a.length; i++) {
			arr.append(a[i] + ",");
		}
		arr.deleteCharAt(arr.lastIndexOf(","));
		arr.append("]");
		System.out.println(arr.toString());
	}

	public static void main(String[] args) {
		BubbleDemo bubble = new BubbleDemo();
		bubble.bubbleSort();
	}
}

插入排序,从数字依次取出元素插入到有序部分的队列中

Demo如下:

package sort.demo;

//插入排序,从数字依次取出元素插入到有序部分的队列中

public class InsertDemo {
	static int sort = 0;
	// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
	int[] a = { 6, 5, 4, 3, 2, 1, 0 };

	public void insert() {
		for (int i = 1; i < a.length; i++) {
			// 1.初始化x和k,即:待插入值a[i],空位索引j
			int x = a[i];
			int j = i - 1;
			System.out.println("x=a[" + i + "]" + "=" + x);

			// 2. 将有序队列中比 x 大的值 a[j] 依次右移,j--循环同时记录也是记录空位索引
			for (; j >= 0 && x < a[j]; j--) {
				a[j + 1] = a[j];
			}

			// 3.插入x
			a[j] = x;
			show(a);
		}
	}

	// 算法细节说明版本
	// 初始化:a{a[0]},即a[0]有序,a[i,a.length]无序
	// 不变式:保持a[0,i-1]==>加入a[i]后a[0,i]有序
	// 实现:x暂存a[i]并比较a[j]-->a[i-1,0],找出正确的空位索引后插入x,使a[1,i]有序
	// 终止:a[0,i-1]加入a[i]即:a[0,a.length]有序
	public void ascInsertWithDescIndex() {
		for (int i = 1; i < a.length; i++) {
			// 1. x暂存待插入值a[i], 初始化空位索引
			int x = a[i];
			int j = i - 1;
			
			// x=a[i]-->a[1,a.length-1]迭代比较a[j]-->a[0,i-1]
			while (j >= 0 && x < a[j]) {
				// 2.比x大的值a[j]右移,同时空位索引减一
				a[j + 1] = a[j];
				j--;
			}
			// 3.插入
			a[j] = x;
			show(a);
		}
	}
}

选择排序是指在无序部分队列中选择出最小的元素,放入有序队列末尾

package sort.demo;

//在无序的队列中选择出最小的元素,放入有序队列末尾
public class SelectDemo {
	// int[] a = { 6, 5, 4, 3, 2, 1, 0 };
	int[] a = { 8, 5, 5, 2, 4, 3, 7, 0 };

	// 算法说明
	public void ascSelectAscIndex() {
		// 初始化: a[0,i]即a[0]有序, min = a[0], a[1,a.length]无序
		// 保持不变式:a[0,i]有序==>加入a[i+1]即a[j]-->a[i,a.length-1]后,a[0,i+1]有序
		// 算法实现:k标记最小值索引,遍历a[j]-->a[i,a.length-1]比较a[k]最终找出最小值的索引赋值给k,
		// 终止:a[0,a.length]有序,同时内部循环j初始化a.length即:无序队列为null
		for (int i = 0; i < a.length; i++) {
			// 1.初始化min索引k
			int k = i;
			// 2.找出min对应的索引,a[i,a.length]无序,必须用for循环,且不能将判断条件放入for内
			for (int j = i + 1; j < a.length; j++) {
				if (a[j] < a[k]) {
					k = j;
				}
				// 3.通过索引互换
				int min = a[k];
				System.out.println("min值a[" + k + "]" + "=" + a[k]);
				a[k] = a[i];
				a[i] = min;
				show(a);
			}
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值