【排序】简单选择排序 & 堆排序


:以下实例都是从小到大排序

简单选择排序

思想

简单选择排序的思想很简单,把一个待排序序列分为两个部分:已排序部分未排序部分。已排序部分不动,未排序部分中选择最小的一个元素和其第一个元素交换,然后该元素纳入已排序部分,其他元素同样的操作,直到未排序部分只剩最后一个元素为止。
例如:
在这里插入图片描述

java代码

class Sort{
	public static void main(String[] args) {
		int[] data = {34,8,64,51,32,21,77,2};
		selectSort(data);
		for(int x : data)
			System.out.print(x+" ");
		System.out.println();
	}
	public static void selectSort(int[] array) {
		for(int i=0; i<array.length-1; i++) {
			int minIdx = i;
			for(int j=i+1; j<array.length; j++) {
				if(array[j] < array[minIdx]) 
					minIdx = j;
			}
			if(minIdx != i)
				swap(array, i, minIdx);
		}
	}
	public static void swap(int[] array,  int i, int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
}

堆排序

思想

从小到大的堆排序:

  1. 根据数组建立一个堆,及一棵完全二叉树;
  2. 将堆调整为一个最大堆,则堆顶元素就是最大的数字;
  3. 交换栈顶元素和当前最大堆的最后一个元素;
  4. 固定当前堆的最后一个元素,剩下的元素仍然构成一个堆(但不是最大堆)
  5. 返回2,直到堆中元素个数为2。

至此,排序结束。

动态过程可以参考视频:https://www.bilibili.com/video/av18980178/
在这里插入图片描述

java代码

class Sort{
	public static void main(String[] args) {
		int[] data = {34,8,64,51,32,21,77,2};
		heapSort(data);
		for(int x : data)
			System.out.print(x+" ");
		System.out.println();
	}
	public static void heapSort(int[] array) {
		int len = array.length;
		// 每调整一次最大堆,就将根结点和未调整的最后一个结点交换
		// 则从后往前完成排序
		// 每次调整只针对未排序的数组部分,所以每次进行调整的个数-1
		for(int i=0; i<len-1; i++) {
			buildMaxHeap(array, len-1-i);
			swap(array, 0, len-1-i);
		}
	}
	public static void buildMaxHeap(int[] array, int lastIdx) {
		// 从最后一个结点的父结点开始
		for(int i=(lastIdx-1)/2; i>=0; i--) {
			int p = i;
			// 判断当前结点有无左孩子,若有说明不是叶子结点
			while(p*2+1 <= lastIdx) {
				int left = 2*p + 1;
				int biggerIdx = left;
				// 判断有无右孩子(right=left+1)
				if(left<lastIdx && array[left]<array[left+1])
					biggerIdx += 1;
				// 若存在孩子大于父结点,将较大的子结点和父结点交换,并向下调整
				if(array[p]<array[biggerIdx]) {
					swap(array, p, biggerIdx);
					p = biggerIdx;
				}
				else
					break;
			}
		}
	}
	public static void swap(int[] array,  int i, int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值