O(n²)排序算法——冒泡、选择、插入

一、冒泡排序(Bubble Sort)

动图转载自Github作者hustcc
在这里插入图片描述

● 基础版本

/**
 * 静态方法:冒泡排序算法
 */
public static void sort(Comparable[] arr) {
	// 外层循环控制每趟排序
	for (int i = 0; i < arr.length - 1; i++) {
		// 内层循环控制元素交换
		for (int j = 0; j < arr.length - i - 1; j++) {
			if (arr[j].compareTo(arr[j + 1]) > 0) {
				swap(arr, j, j + 1);
			}
		}
	}
}

● 优化版本

基础版本会按照最保险的策略进行排序,所以可能产生无意义的趟数
优化后的版本一旦确定数组排序完成,便会立刻结束排序

/**
 * 静态方法:优化的冒泡排序算法
 */
public static void sort(Comparable[] arr) {
	int n = arr.length;
	boolean flag = false;
	do {
		flag = false;
		for (int i = 0; i < n - 1; i++) {
			if (arr[i].compareTo(arr[i + 1]) > 0) {
				swap(arr, i, i + 1);
				// 如果当前轮次发生了交换,则说明数组尚未排序完成,激活flag
				flag = true;
			}
		}
		// 每趟排序都会决定出一个最大值,故可以减少下一次排序的元素数量
		n--;
	} while (flag);
}

假设现有数组Integer arr[] = {1, 2, 3, 4, 5, 6}需要进行升序排序,但目前的数组已经是升序状态了,如果使用标准版本的排序算法,还是会进行5趟排序,而优化版本在第一轮的时候就会判定已排序完毕并结束。
在这里插入图片描述


二、选择排序(Selection Sort)

动图转载自Github作者hustcc
在这里插入图片描述

/**
 * 静态方法:选择排序算法
 */
public static void sort(Comparable[] arr) {
	// 外层循环遍历每一个元素
	for (int i = 0; i < arr.length; i++) {
		// 默认当前位置的元素索引为minIndex
		int minIndex = i;
		// 内层循环从当前位置起开始遍历
		for (int j = i + 1; j < arr.length; j++) {
			// 如果有元素比minIndex元素还要小,则更新minIndex的值
			if (arr[j].compareTo(arr[minIndex]) < 0) {
				minIndex = j;
			}
		}
		// 将最小的元素与起始元素交换
		swap(arr, i, minIndex);
	}
}

三、插入排序(Insertion Sort)

动图转载自Github作者hustcc
在这里插入图片描述

/**
 * 静态方法:插入排序算法
 */
public static void sort(Comparable[] arr) {
	// 外层循环遍历数组的每一个位置
	for (int i = 0; i < arr.length; i++) {
		// 将arr[i]的值拷贝一份
		Comparable e = arr[i];
		int j;
		// 内层循环从当前元素开始往前查询
		// 如果有元素的值比e大,则将其往后拷贝
		for (j = i; j > 0 && arr[j - 1].compareTo(e) > 0; j--) {
			arr[j] = arr[j - 1];
		}
		// 查询结束后,将e的值放入它最终的位置
		arr[j] = e;
	}
}
发布了48 篇原创文章 · 获赞 4 · 访问量 6151

猜你喜欢

转载自blog.csdn.net/Knightletter/article/details/103416869