插入排序 冒泡 选择 快速

本文详细介绍了四种常见的排序算法:插入排序、选择排序、冒泡排序和快速排序。通过具体实例展示了每种算法的工作原理、优缺点及其适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test;

public class Demo5_3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int arr1[] = { 1, 6, 0, -1, 9, 3, 2, 44, 33, 77 };

		// 用插入法定义一个对象
		InsertSort is = new InsertSort();

		is.sort(arr1);
		System.out.println(arr1);
	}
}

/*
 * 1插入排序 已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1
 * ]与a[1]的值
 * ,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x
 * ],则将a[x]
 * ~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b
 * [1]当作n=1的数组a)
 * 
 * 优点:稳定,快; 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
 */
class InsertSort {
	// 插入排序法
	public void sort(int arr[]) {
		for (int i = 1; i < arr.length; i++) {
			int insertVal = arr[i];
			// insertVal准备和前一个数比较
			int index = i - 1;
			while (index >= 0 && insertVal < arr[index]) {
				// 将把arr[index]向后移动
				arr[index + 1] = arr[index];
				// 让index 向前移动
				index--;
			}
			// 将insertVal 插入到适当的位置
			arr[index + 1] = insertVal;
		}
	}
}

/*
 * 1 选择排序
 * 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变
 * 。再比较a
 * [1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],以此类推,最后比较a[1]与a[n]的值。这样处理一轮后
 * ,a
 * [1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[
 * 4]~a[n]以相同方法比较一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
 * 
 * 优点:稳定,比较次数与冒泡排序一样; 缺点:相对之下还是慢。
 */
class Select {
	// 选择快排序
	int temp = 0;

	public void sort(int arr[]) {
		// 认为第一个数字是最小的
		int temp = 0;
		for (int j = 0; j < arr.length - 1; j++) {
			int min = arr[j];
			// 记录最小数的下标
			int minIndex = j;
			for (int k = j + 1; k < arr.length; k++)
				if (min > arr[k]) {
					min = arr[k];
					minIndex = k;
				}
			temp = arr[j];
			arr[j] = arr[minIndex];
			arr[minIndex] = temp;
		}
	}
}

/*
 * 3、冒泡排序 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与 a[2]的值,若a[1]大于a[2]则交换
 * 两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比 较a[3]与a[4],以此
 * 类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n- 1]以相同方法
 * 处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理 n-1 轮
 * 后a[1]、a[2]、……a[n]就以升序排列了。
 * 
 * 优点:稳定; 缺点:慢,每次只能移动相邻两个数据。
 */
class Bubble {
	public void test(int a) {
		a++;
	}

	public void sort(int arr[]) {
		int temp = 0;
		// i是决定走几趟, 冒泡排序
		for (int i = 0; i < arr.length - 1; i++) {
			// 内层循环,开始逐个比较,如果发现前一个数比后一个数大就交换
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					// 换位
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
	}
}

/*
 * 4:快速排序
 * 快速排序,是最常用的排序算法,就是选择待排序的列表中的其中一个数字,作为基准数,然后把小于基准数的所有数字放到这个数的左边,大于这个数的所有数字放到基准数的右边
 * 。这个时候开始分为两部分,左边和右边。第一部分,在左边中选择一个数字作为基准数,把小于这个数字的放到这个数的左边,大于这个数的放到这个数的右边。第二部分,
 * 在右边中选择一个数字作为基准数,把小于这个数字的放到这个数的左边,大于这个数的放到这个数的右边。ok,很明显,递归!
 * 
 * 快速排序的时间复杂度在最坏的情况下是O(N2),因为和冒泡排序一样,需要两两交换。平均情况下,快速排序的时间复杂度是O(NlogN)。
 * 
 * 
 * 
 * 优点:极快,数据移动少; 缺点:不稳定。
 */
class QuickSort {
	public void sort(int[] a, int low, int high) {

		int pos;
		if (low < high) {
			pos = FindPos(a, low, high);
			sort(a, low, pos - 1);
			sort(a, pos + 1, high);
		}
	}

	public int FindPos(int[] a, int low, int high) {
		int val = a[low];
		while (low < high) {
			while (low < high && a[high] >= val)
				--high;
			a[low] = a[high];
			while (low < high && a[low] <= val)
				++low;
			a[high] = a[low];
		}
		a[low] = val;
		return low;
	}
}

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值