冒泡排序、选择排序、插入排序java代码实现

本文介绍了三种基本排序算法——冒泡排序、选择排序和插入排序的Java代码实现。冒泡排序通过不断交换相邻元素将最大值逐步推至末尾;选择排序每次从剩余未排序元素中找到最小值与当前未排序区首元素交换;插入排序则通过比较将每个元素插入到已排序部分的正确位置。
摘要由CSDN通过智能技术生成

1.冒泡排序

这种排序方式是最简单的,4, 3, 6, 7来当作一个例子(从小到大排序),每一次进行排序先选择第一个4与后面的3进行比较然后4比3大交换位置,4与6比较6大不变,6与7比较7大不变,这样一趟之后最大的值就到了最后的位置。依次进行一共是n-1次就完成了排序。

public class Test15 {
	public static void main(String[] args) {
		int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
		buddleSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	public static void buddleSort(int arr[]) {
		int temp = 0;
		boolean flag = false;//这里是一个优化,进行一个循环的比较之后,发现没有交换了,说明已经排序好了
		for (int i = 1; i < arr.length; i++) {//一共需要n-1次
			for (int j = 0; j < arr.length - i; j++) {//arr.length - i,这里的意思是,经过一个循环之后最大的值已经到了最后了,就没有必要再去比较了
				if (arr[j] > arr[j + 1]) {//当这个数大于后一个数的时候,进行交换
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					flag = true;//这里是一个标志,表示进行了交换
				}
			}
			if (!flag) {//当flag=false的时候就出现了没有交换的情况,就没有必要继续循环了
				break;
			} else {
				flag = false;//把前面交换后的true变为false
			}
		}
	}

}

2.选择排序

选择排序也是一个内排序,4, 3, 6, 7,还是这个例子,你第一次选择是在arr[0]-arr[n]中选择最小的(升序)的值然后与arr[0]进行交换,第二次就是在arr[1]-arr[n]中选择最小的值然后与arr[1]进行交换,一直重复就可以了。

public class Test16 {
	public static void main(String[] args) {
		int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
		selectSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	public static void selectSort(int arr[]) {
		for (int i = 0; i < arr.length - 1; i++) {//只需要n-1次就可以了
			int min = arr[i];//先选择数组中的一个值为最小值
			int minlength = i;//记录最小值的下标
			for (int j = i + 1; j < arr.length; j++) {//从最小值的后一位开始,一直到最后
				if (min > arr[j]) {//当最小值大于arr[j]
					min = arr[j];//重新选择最小值
					minlength = j;//重新记录最小值下标
				}
			}
			if (i!=minlength) {//这里是为了不必要的交换,因为要是原来选择的就是最小值了就没有必要交换了
				arr[minlength] = arr[i];
				arr[i] = min;
			}
		}
	}

}

3.插入排序

最后一种排序了,这个排序也是很简单,其实排序中难的还是快速排序,归并排序和堆排序,其他的还是简单的。
4, 3, 1, 7,还是这个例子,插入排序就是,先选择第一个4,然后再选择4后面一个就是3,3和4进行比较如果3小于4就让4移到3的位置,3就移到4的位置,3 4 1 7.然后选择1,1与4比较,1小于4把1与4交换,1再与3比较,1小于3,再交换,就是这样,直到最后一个。

public class Test17 {
	public static void main(String[] args) {
		int arr[] = { 4, 3, 6, 7, 2, 9, -4, -90, 67, 88, 4 };
		insertSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void insertSort(int arr[]) {
		for (int i = 1; i < arr.length; i++) {//从数组第二个开始
			int insert=arr[i];//保存第二个数,就是要往前面插入的数
			int insetIndex=i-1;//记录要插入的数的前一个
			while (insetIndex>=0&&insert<arr[insetIndex]) {//当要插入的数小于前面的数
				arr[insetIndex+1]=arr[insetIndex];//这里大家可能觉得有点怪,这是因为虽然往后移了,但是要插入的数我是保存的,所以没有丢失
				insetIndex--;//这里要进行减减的操作,因为要往前面继续判断,前面可能还有值会小于要插入的值
			}
			arr[insetIndex+1]=insert;//insetIndex+1这个大家需要思考一下,这是因为前面在循环里是做了一个减减的操作,这里必须要加上,
			//要是没有进入循环这里也是要进行加的操作因为是要插入到后面,其实就没有动
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值