排列算法总结

									永远温柔,永远知进退。

冒泡排序

从小到大或从大到小进行排序,采用双重for循环嵌套得方式进行排序,可以利用Boolean进行标识减少排序得次数来优化程序。

int[] arr = {};//定义一个数组
for (int i = 0; i < arr.length - 1; i++) {
	boolean flag = true;
	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;
			flag = false;
		}
		count++;
	}
	if(flag) {
		break;
	}
}

选择排序

顾名思义有选择得进行排序,比如说有一组数字,遍历找到最小与第一个数字交换,再找到第二小的数与第二位交换,以此类推,直至结束。

int[] arr = {};//定义一个数组
for (int i = 0; i < arr.length - 1; i++) {
	int index = i;
	for (int j = 1 + i; j < arr.length; j++) {
		if (arr[j] < arr[index]) {
			index = j;//找到最小元素的索引记录下来
		}
	}
	int temp = arr[index];
	arr[index] = arr[i];
	arr[i] = temp;
}

插入排序

利用第二个数和第一个数进行比较,若小则插到索引为0的位置上,第三个数和第二个数进行比较,若小则插到索引为1的位置上,若大则不动,第四个数和第三个数进行比较,若小则插到索引为2的位置上,若大则不动,以此类推直至结束。

int[] arr = {};//定义一个数组
for (int i = 1; i < arr.length; i++) {
	// 定义待插入的数
	int insertValue = arr[i];
	// 找到待插入数的前一个数的下标
	int insertIndex = i - 1;
	while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
		arr[insertIndex + 1] = arr[insertIndex];
		insertIndex--;
	}
	arr[insertIndex + 1] = insertValue;
}

希尔排序

对数组长度进行二分法进行元素的排序,比如长度为10,第一次则10/2=5组,也就是说第一个和第六个元素为一组,第二个和第七个为一组,以此类推两个元素进行比较若第六个比第一个小,则两个元素进行互换。第二次为5/2=2组,13579为一组,246810为一组,元素交叉,两组元素分别进行插入排序,第三次2/2=1组,进行插入排序,到此结束。

int[] arr = {};
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
	// 对数组元素进行分组
	for (int i = gap; i < arr.length; i++) {
		// 遍历各组中的元素
		for (int j = i - gap; j >= 0; j -= gap) {
			// 交换元素
			if (arr[j] > arr[j + gap]) {
				int temp = arr[j];
				arr[j] = arr[j + gap];
				arr[j + gap] = temp;
			}
		}
	}
}

以上均为闲暇时光随便整理,若哪里说的不对还望指教,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值