【基本排序实现 笔记记录】

本文详细介绍了四种基本排序算法:冒泡排序、选择排序、插入排序和希尔排序。冒泡排序和插入排序是稳定的排序算法,而选择排序和希尔排序则是不稳定的。冒泡排序通过相邻元素比较交换来排序;选择排序每次找到最小元素并置于正确位置;插入排序则将每个元素插入到已排序部分的正确位置;希尔排序通过设置间隔序列改进了插入排序的效率。四种算法的时间复杂度均为O(n^2),但希尔排序在某些情况下能更快完成排序。
摘要由CSDN通过智能技术生成

冒泡排序 稳定的排序

冒泡排序是一种稳定排序,因为在两个数交换的时候,如果两个数相同,那么它们并不会因为算法中哪条语句相互交换位置
时间复杂度:是 O(n^2)

	//冒泡排序
	public static void bubbleSort(int[] arr) {
		int n=arr.length;
		for (int i = 0; i < n - 1; i++) {// 控制比较轮次,一共 n-1 趟
			for (int j = 0; j < n - 1 - i; j++) {// 控制两个挨着的元素进行比较
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
	}

选择排序 不稳定的排序

时间复杂度:是 O(n^2)
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法

	//选择排序
	public static void selectionSort(int arr [] ){
		int n=arr.length;
		int minindex,temp;
		for (int i = 0; i < n-1; i++) {
			minindex=i;
			for (int j = i+1; j < n; j++) {
				if (arr[j]<arr[minindex]) {// 寻找最小的数
					minindex=j; // 将最小数的索引保存
				}
			}
			temp=arr[i];
			arr[i]=arr[minindex];
			arr[minindex]=temp;
		}
	}

插入排序 稳定的排序

插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。
插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。

// 插入排序
	public static void insertionSort(int arr[]) {
		for (int i = 1; i < arr.length; i++) {// i: 代表即将插入的元素角标,作为每一组比较数据的最后一个元素
			for (int j = i; j > 0; j--) { // j:代表数组角标
				if (arr[j - 1] > arr[j]) {// 符合条件,插入元素(交换位置)
					int temp = arr[j];
					arr[j] = arr[j - 1];
					arr[j - 1] = temp;
				}
			}
		}
	}

希尔排序 不稳定

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
时间复杂度:O(n^(1.3—2))

public static void shellSort(int arr[]) {
		// 不断缩小增量
		for (int interval = arr.length / 2; interval > 0; interval /= 2) {
			// 增量为1的插入排序
			for (int i = interval; i < arr.length; i++) {
				int target = arr[i];
				int j = i - interval;
				while (j < -1 && target < arr[j]) {
					arr[j + interval] = arr[j];
					j -= interval;
				}
				arr[j + interval] = target;
			}
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱喝阔落的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值