排序算法(Java随笔)—选择排序&堆排序

选择排序(Selection Sort):思路简单,一般在每一步中选择最小值来重新排列,从而达到排序的目的。

选择排序通过选择和交换来实现排序:

选择排序算法实例——代码实现:

// 选择排序——选择+交换
	int[] selectSort(int[] data) {
		int index;// 保存每次循环的比较时最小值的地址
		int temp;
		for (int i = 0; i < data.length - 1; i++) {
			index = i;
			for (int j = i + 1; j < data.length; j++) {
				if (data[j] < data[index]) {
					index = j;
				}
			}
			// 交换数据
			if (index != i) {
				temp = data[index];
				data[index] = data[i];
				data[i] = temp;
			}
			// 打印出每次循环排序后的结果
			//System.out.println(Arrays.toString(data));
		}
		return data;
	}

运行测试:

// 选择排序算法测试
	public static void main(String[] args) {
		int[] data = new int[] { 9, 3, 6, 0, 2, 5, 9, 7, 5, 0 };
		SuanFa sf = new SuanFa();
		data = sf.selectSort(data);
		System.out.println(Arrays.toString(data));
	}

//运行结果:
[0, 0, 2, 3, 5, 5, 6, 7, 9, 9]

堆排序(Heap Sort):基于选择排序思想,利用堆结构和二叉树的一些性质来完成数据的排序,堆排序在某些场合具有广泛的应用。

堆结构:一种树结构,准确的说是一个完全二叉树,如果按照从小到大的顺序排序,要求非叶子结点的数据要大于或等于其左右子结点的数据(最大堆);如果按照从大到小的顺序排序,要求非叶子结点数据要小于或等于其左右子结点的数据(最小堆)。即如果要求数组数据从小到大排序时,堆结构的根结点为要求的最大值。

堆排序算法实例——代码实现:

// 堆排序算法——完全二叉树+选择排序(由三个方法构成,最后一个为外部调用方法)
	void heapSortUtil1(int[] data, int rootNode, int len) {
		int max = rootNode;// 定义最大值在根结点
		int leftNode = 2 * max + 1;// 根结点的左子结点
		int rightNode = 2 * max + 2;// 根结点的右子节点
		// 左子节点存在并且大于根结点、修改max指向最大值
		if (leftNode < len) {
			if (data[leftNode] > data[max]) {
				max = leftNode;
			}
		}
		// 右子节点存在并且大于根结点、修改max指向最大值
		if (rightNode < len) {
			if (data[rightNode] > data[max]) {
				max = rightNode;
			}
		}
		// 如果max指向改变了、则交换根结点数据,使其比左右子节点数据大
		if (max != rootNode) {
			int temp = data[max];
			data[max] = data[rootNode];
			data[rootNode] = temp;

			// 子节点数据发生改变、递归检查子结点之下的结点数据是否满足要求
			heapSortUtil1(data, max, len);
		}
	}

	// 从数组的最后一个元素(树的底部最后一个结点)开始,完成第一次排序(最大值在树根位置)
	void heapSortUtil2(int[] data, int len) {
		for (int i = len - 1; i >= 0; i--) {
			heapSortUtil1(data, i, len);
		}
	}

	// 将最大值交换到树根,然后将最大值转移到数组尾部,树大小减一,再次进行排序选出最大值
	int[] heapSort(int[] data) {
		for (int i = 0; i < data.length; i++) {
			heapSortUtil2(data, data.length - i);
			// 上面程序结束后,最大值位于数组第一位,接下来转移最大值到数组尾部
			int temp = data[0];
			data[0] = data[data.length - 1 - i];
			data[data.length - 1 - i] = temp;
		}
		return data;
	}

运行测试:

// 堆排序算法测试
	public static void main(String[] args) {
		int[] data = new int[] { 9, 3, 6, 0, 2, 5, 9, 7, 5, 0 };
		SuanFa sf = new SuanFa();
		data = sf.heapSort(data);
		System.out.println(Arrays.toString(data));
	}

//运行结果:
[0, 0, 2, 3, 5, 5, 6, 7, 9, 9]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值