排序算法【O(n^2)】

概念:将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。

分类:

  • 内部排序:将需要处理的数据全部加载到内部存储器中进行排序
    • 插入排序
      • 插入排序
      • 希尔排序
    • 选择排序
      • 选择排序
      • 堆排序
    • 交换排序
      • 冒泡排序
      • 快速排序
    • 归并排序
    • 基数排序
  • 外部排序:数量量过大,无法全部加载到内存中,需要借助外部存储进行排序
    在这里插入图片描述

一、冒泡排序

  • 思想:两个相邻元素进行比较交换

通过对待排序序列从前往后,依次比较相邻元素的值,若发现后一个比前一个大就进行交换,使得较大元素逐渐从前移向后部,就像是军训站队,高个子依次与后面的人进行比较交换位置。进行length-1次排序。

  • 代码
	// 冒泡排序
	public static void sort(int[] arrs) {
		int temp = 0;
		// 进行length-1次比较
		for (int i = 0; i < arrs.length - 1; i++) {
			// 定义标志位,用于提前结束比较
			boolean flag = true;
			// 每次将最后排序好的数据排除
			for (int j = 0; j < arrs.length - 1 - i; j++) {
				// 如果前一个比后一个大就进行交换
				if (arrs[j] > arrs[j + 1]) {
					flag = false;
					temp = arrs[j];
					arrs[j] = arrs[j + 1];
					arrs[j + 1] = temp;
				}
			}
			// 结束比较
			if (flag) {
				break;
			}
		}
	}

二、选择排序

  • 思想:排序的元素依次与其他元素比较得出最小值与之交换。

第一次从arrs[0]arrs[n-1]中查找出最小值与arrs[0]进行交换。下一次从arrs[1]arrs[n-1]中查找出最小值与arrs[1]进行交换,依次执行n-1次。

  • 代码
	// 选择排序
	public static void sort(int[] arrs) {
		// 进行length-1次比较
		for (int i = 0; i < arrs.length - 1; i++) {
			// 定义最小值的下标
			int minIndex = i;
			// 取出当前要比较的元素
			int min = arrs[minIndex];
			// 与之后没有进行比较的元素依次比较得出最小值的下标
			for (int j = i + 1; j < arrs.length; j++) {
				// 如果比较的元素大于该元素交换下标和最小值
				if (min > arrs[j]) {
					minIndex = j;
					min = arrs[j];
				}
			}
			// 如果比较元素不是最小值,就将比较得出的值进行交换
			if (minIndex != i) {
				arrs[minIndex] = arrs[i];
				arrs[i] = min;
			}
		}
	}

三、插入排序

  • 思想:将要排序的元素以插入的方式找寻该元素的适当的位置

把n个待排序的数组看成为一个有序表和一个无序表。有序表中有第一个元素,无序表中有n-1个元素。排序时从无序表中取出第一个元素,把它依次与有序表中进行比较,进行插入到适当位置。

  • 代码
	// 插入排序
	public static void sort(int[] arrs) {
		// 进行length-1次排序
		for (int i = 1; i < arrs.length; i++) {
			// 记录待插入的值
			int insertVal = arrs[i];
			// 记录待插入进行比较的位置(从尾部向前进行依次比较)
			int insertIndex = i - 1;
			// 如果插入的位置大于0(说明有位置考研插入)以及插入值小于有序表中元素(说明待插入值应该在前一位或更前面)
			while (insertIndex >= 0 && insertVal < arrs[insertIndex]) {
				// 将前面插入的位置空留出来给待插入的元素
				arrs[insertIndex + 1] = arrs[insertIndex];
				insertIndex--;
			}
			// insertIndex对应的是前一个比较元素的位置
			arrs[insertIndex + 1] = insertVal;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常见的时间复杂度恒为 $O(n^2)$ 的排序算法有冒泡排序、插入排序和选择排序。 1. 冒泡排序 冒泡排序是一种简单直观的排序算法,其基本思想是不断交换相邻逆序的元素,将待排序序列中较大的数往后移动,较小的数往前移动。具体步骤如下: 1. 从头到尾遍历待排序序列,比较相邻两个元素的大小,如果它们的顺序错误,则交换它们的位置。 2. 重复执行上述操作,直到整个序列有序为止。 冒泡排序的时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$,是一种稳定排序算法。 2. 插入排序 插入排序的基本思想是将待排序的元素分为已排序区间和未排序区间。初始时,已排序区间只有一个元素,即第一个元素。每次从未排序区间中取出一个元素,插入到已排序区间的合适位置,直到未排序区间中元素全部排完为止。具体步骤如下: 1. 从第二个元素开始,依次将每个元素插入到它前面已排好序的序列中的正确位置。 2. 重复执行上述操作,直到所有元素均排序完成。 插入排序的时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$,是一种稳定排序算法。 3. 选择排序 选择排序的基本思路是每次从待排序序列中选择最小(或最大)的元素,放到序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)的元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完成。具体步骤如下: 1. 在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。 2. 从剩余未排序的元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。 3. 重复执行上述操作,直到所有元素均排序完成。 选择排序的时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$,是一种不稳定排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值