浅谈八大排序算法之冒泡排序

接下来八天我谈谈我对八大排序算法的理解

从今天开始算是第一天吧,今天说说冒泡排序算法,冒泡排序算法算是众多排序算法中稍微简单的一个了,但是对于冒泡排序,可能许多人代码写的来,但是理解的还是不够深入,今天我就来说说我对冒泡排序的看法吧

所谓冒泡排序就是类似水泡上浮的过程,
在这里插入图片描述
在冒泡排序中 我们需要两层嵌套循环,第一层循环 就是每一次将最大的数放到数组的最后一个位置,所以我们需要进行 数组的长度-1 次循环 ,这个不用对做解释,而第二层循环就是细节了,怎样使最大的数调整到最后?

这里给出我的思考,我们设置两个指针,第一个指针指向第一个元素,第二个指针指向第二个元素,然后我们比较这两个指针只想的元素的大小,如果前面的大于后面的,我们就做交换,知道后面的指针到达数组最后,我们知道外层循环控制已经排好序的个数,所以我们要根据外层循环控制第二个指针的位置上
话不多说 上代码

public static void bubbleSort(int[] arr) {

		// 中间变量
		int temp;
		// 循环length-1 次
		for (int i = 0; i < arr.length - 1; i++) {

			// start end指向两个数 判断大小
			for (int start = 0, end = 1; end <= arr.length - 1 - i; start++, end++) {

				if (arr[start] > arr[end]) {
					temp = arr[start];
					arr[start] = arr[end];
					arr[end] = temp;

				}

			}
		}

	}


可以看出冒泡排序的算法复杂度高达O(n^2) ,对于少量的数据还是不错的,数量一大就不行了。
下面我们进行思考看下面这个数组
6 1 2 3 4 5
如果我们这个数组要进行排序,你会发现什么问题吗,可以发现我们在进行第一次上浮之后,将6放到了末尾,我们数组就已经是有序的了,但是因为我们代码的原因,还要进行后续的判断,所以我们代码就还可以进行优化,代码如下

public static void bubbleSort(int[] arr) {

		// 中间变量
		int temp;
		//
		boolean isFlag = false;
		// 循环length-1 次
		for (int i = 0; i < arr.length - 1; i++) {

			// start end指向两个数 判断大小
			for (int start = 0, end = 1; end <= arr.length - 1 - i; start++, end++) {

				if (arr[start] > arr[end]) {
					// 如果有交换的,设置isFlag 为 true
					isFlag = true;

					temp = arr[start];
					arr[start] = arr[end];
					arr[end] = temp;

				}

			}
			// 如果有交换 则 继续循环
			if (isFlag) {
				continue;
			} else {// 如果没有交换 则退出循环
				break;
			}

		}

	}

优化后的代码可以进行判断,如果我们再一次冒泡的过程中,没有进行一次交换,就退出循环,说明这时候数组已经是排好序的了.

猜你喜欢

转载自blog.csdn.net/weixin_44112559/article/details/98652700