使用java实现冒泡排序和选择排序

冒泡排序原理

假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不动…第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。
第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动…第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换位置,否则不动。第二轮循环结束,第二大的数挪到了第九个数的位置,比较进行了8次。

第九轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动。第九轮循环结束,倒数第二大的数挪到了第二个数的位置,比较进行了1次。
总体原理:每轮比较找到最大的数。

冒泡排序实现思路

先写出内循环

			for (int i = 0; i < a.length - 1 ; i++) {
				if (a[i] > a[i + 1]) {
					// change
					temp = a[i + 1];
					a[i + 1] = a[i];
					a[i] = temp;
				}
			}

这个比较好理解,就是第一轮循环
那么第二轮怎么比较呢?其实比较和上一轮几乎一样,只不过比较次数比第一次少1次
第三轮怎么比较呢?其实比较和上一轮几乎一样,只不过比较次数比第二次少1次

所以我们要复用内循环,而内循环的次数由i < a.length - 1 决定,那么,我们要使它每轮循环后递减,不难想到,可以再嵌套循环,将条件改为i < a.length - 1-j;j从零递增,那么第一次,内循环执行了 a.length - 1-0次;第二次,内循环执行了 a.length - 1-1…第九次执行了a.length-1-8次(a.length=10)

冒泡排序的java实现

public class BubbleSort {
	public static void main(String[] args) {
		int a[] = { 2, 3, 6, 4, 0, 1, 7, 8, 5, 9 };
		bubbleSort(a);
	}

	public static void toString(int[] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.println(a[i]);
		}
	}

	private static void bubbleSort(int[] a) {
		int length = a.length;
		int temp = 0;
		for (int j = 0; j < a.length - 1; j++) {
			for (int i = 0; i < a.length - 1 - j; i++) {
				if (a[i] > a[i + 1]) {
					// change
					temp = a[i + 1];
					a[i + 1] = a[i];
					a[i] = temp;
				}
			}
		}
		toString(a);
	}
}

冒泡排序的比较示意图

这里写图片描述

选择排序原理

假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第一个数和第三个数比较,如果第一个数大,第一个数和第三个数交换位置,否则不动…第一个数和第十个数比较,如果第一个数大,第一个数和第十个数交换位置,否则不动。第一轮循环结束,最小的数挪到了第一个数的位置,比较进行了9次。
第二轮循环,第二个数和第三个数比较,如果第二个数大,第而个数和第三个数交换位置,否则不动…第二个数和第十个数比较,如果第二个数大,第二个数和第十个数交换位置,否则不动。第二轮循环结束,第二小的数挪到了第二个数的位置,比较进行了8次。

第九轮循环,第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第九轮循环结束,倒数第二小的数挪到了倒数第二个的位置,比较进行了1次。

选择排序(伪)的实现思路

先写内循环,第一轮比较应该是这样

			for (int i = 0; i < length- 1; i++) {
				if (a[0] > a[i + 1]) {
					// change
					temp = a[0];
					a[0] = a[i + 1];
					a[i + 1] = temp;
				}
			}

执行完毕后最小的数到0的位置
第二次应该这样

			for (int i = 1; i < length- 1; i++) {
				if (a[1] > a[i + 1]) {
					// change
					temp = a[1];
					a[1] = a[i + 1];
					a[i + 1] = temp;
				}
			}

可以推导出以下代码

		for (int j = 0; j <length- 1;j++) {
			for (int i = j; i < length- 1; i++) {
				if (a[j] > a[i + 1]) {
					// change
					temp = a[j];
					a[j] = a[i + 1];
					a[i + 1] = temp;
				}
			}
		}

选择排序(伪)的java实现

public class SeletSort {
	public static void main(String[] args) {
		int a[] = { 2, 3, 6, 4, 0, 1, 7, 8, 5, 9 };
		seletSort(a);
	}

	public static void toString(int[] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.println(a[i]);
		}
	}

	private static void seletSort(int[] a) {
		int length = a.length;
		int temp = 0;
		for (int j = 0; j <length- 1;j++) {
			for (int i = j; i < length- 1; i++) {
				if (a[j] > a[i + 1]) {
					// change
					temp = a[j];
					a[j] = a[i + 1];
					a[i + 1] = temp;
				}
			}
		}
		toString(a);
	}
}

选择排序的动态示意图

这里写图片描述
这里写图片描述

选择排序(真)的写法

在网上看算法动态图时发现,很多选择排序在每一轮比较会记住最小数字的下标,在这一轮比较结束后将最小的数和这一轮比较的第一个数交换。而不是像上面那样每比较一次都有可能交换,因为上面一种算法没有记录最小元素的下标。按这种实现,代码应该写成这样:

	private static void seletSort(int[] a) {
		int length = a.length;
		int temp = 0;
		int minIndex;
		for (int j = 0; j <length- 1;j++) {
			minIndex = j;
			for (int i = j; i < length- 1; i++) {
				if (a[minIndex] > a[i + 1]) {
					minIndex = i+1;
				}
			}
			temp = a[minIndex];
			a[minIndex]= a[j];
			a[j]=temp;
		}
		toString(a);
	}

选择排序的意思应该是,在一轮比较中,选择当前比较数中最小的那个,放到最前面的位置,从这个角度看,第二种写法更符合选择排序这个名字呢。(这样写避免了无意义的交换)

推荐:算法动图演示

以下是算法动态图演示,可以帮助理解。
动图演示blog

  • 29
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这是使用 Java 实现冒泡排序的代码示例: ``` public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换 arr[j] 和 arr[j + 1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 该代码实现冒泡排序算法的基本逻辑,它通过两个嵌套的循环来遍历整个数组,并通过交换顺序错误的元素来排序数组。 ### 回答2: 冒泡排序是一种基础的排序算法,它通过不断比较相邻的两个元素,将较大的元素逐渐交换到右边,达到排序的目的。 使用Java实现冒泡排序的步骤如下: 1. 首先,创建一个整型数组来存储需要排序的元素。 2. 使用一个for循环来遍历数组,外层循环控制比较的轮数,总共需要比较数组长度减1次。 3. 在每一轮比较中,再使用一个内层循环来比较相邻的元素,内层循环控制每一轮需要比较的次数。 4. 比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置。 5. 继续进行下一轮的比较,直到所有的元素都排好序。 下面是Java代码实现冒泡排序: ```java public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 2, 8, 3, 1}; 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]) { // 交换两个元素的位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 输出排序结果 for (int num : arr) { System.out.print(num + " "); } } } ``` 以上代码的输出结果为:1 2 3 5 8,表示已经成功对数组进行了冒泡排序冒泡排序的时间复杂度为O(n^2),是一种相对简单但效率较低的排序算法。 ### 回答3: 冒泡排序(Bubble Sort)是一种简单的排序算法,通过不断地交换相邻的元素来实现排序。 首先,我们需要定义一个用于存储待排序元素的数组。假设我们有一个整数数组arr,大小为n。 接下来,我们需要使用两个嵌套循环来比较和交换数组中的元素。外部循环控制排序的轮数,而内部循环用于比较相邻元素并进行交换。 下面是使用Java实现冒泡排序的代码: ```java public class BubbleSort { public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换arr[j]和arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(arr); System.out.println("排序后的数组:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } ``` 以上代码定义了一个名为BubbleSort的类,其中包含了实现冒泡排序的方法bubbleSort。在main方法中,我们创建了一个包含一些整数的数组arr,并调用bubbleSort方法对其进行排序。最后,我们将排序后的数组打印出来。 执行以上代码,输出结果将为: 排序后的数组:11 12 22 25 34 64 90 以上就是使用Java实现冒泡排序的方法。冒泡排序算法的时间复杂度为O(n^2),虽然效率较低,但对于小规模的数据排序仍然是一种较好的选择。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值