(恋上数据结构笔记):冒泡、选择、堆排序

冒泡、选择、堆排序

目录

冒泡、选择、堆排序

学习大纲

10大排序算法

冒泡排序(Bubble Sort)

冒泡排序优化1

冒泡排序优化2

排序算法的稳定性(Stability)

原地算法(In-place Algorithm)

选择排序(Selection Sort)

堆排序(Heap Sort)

学习大纲

10大排序算法

冒泡排序(Bubble Sort)

  • 执行流程(统一以升序为例子)
  • ①从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置
    • 执行完一轮后,最末尾那个元素就是最大的元素
  • ②忽略①中曾经找到的最大元素,重复执行步骤①,直到全部元素有序

冒泡排序优化1

  • 只针对有序有优化效果。

冒泡排序优化2

  • 如果序列尾部已经局部有序,可以记录最后1次交换的位置,减少比较次数

排序算法的稳定性(Stability)

原地算法(In-place Algorithm)

选择排序(Selection Sort)

堆排序(Heap Sort)

/**
 * 堆排序
 */
public class HeapSort<T extends Comparable<T>> extends Sort<T> {
	private int heapSize; // 堆大小

	@Override
	protected void sort() {
		// 原地建堆(自下而上的下滤)
		heapSize = array.length;
		for (int i = (heapSize >> 1) - 1; i >= 0; i--) {
			siftDown(i);
		}
		
		while (heapSize > 1) {
			// 交换堆顶元素和尾部元素
			swap(0, --heapSize);

			// 对0位置进行siftDown(恢复堆的性质)
			siftDown(0);
		}
	}
	
	private void siftDown(int index) {
		T element = array[index];
		
		int half = heapSize >> 1;
		while (index < half) { // index必须是非叶子节点
			// 默认是左边跟父节点比
			int childIndex = (index << 1) + 1;
			T child = array[childIndex];
			
			int rightIndex = childIndex + 1;
			// 右子节点要存在, 并且比左子节点大
			if (rightIndex < heapSize && 
					cmp(array[rightIndex], child) > 0) { 
				child = array[childIndex = rightIndex];
			}
			
			// 大于等于子节点
			if (cmp(element, child) >= 0) break;
			
			array[index] = child;
			index = childIndex;
		}
		array[index] = element;
	}

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值