八大排序方法解析与巧记(三)选择排序
来源:互联网 发布:青牛软件电话 编辑:程序博客网 时间:2024/05/11 14:20
1. 基本介绍
选择排序分为两类:简单选择排序和堆排序。简单选择排序,真的很简单:从排在待排序元素后面的元素中选一个最小(或最大)的元素与待排序元素比较。要理解堆排序,需要先了解什么是堆,以及如何将一组数变成堆。
2. 简单选择排序
2.1基本思路
太简单,主要分为两步,一选择,二比较、交换。
2.2 示意图
2.3 算法实现
从小到大排序
public static void simpleSelectionSort(int[] a ){ for(int i=0; i<a.length; i++){ int temp = a[i+1]; //temp用于存储a[i]后的最小值 for(int j=i+2;j<a.length;j++){ if(a[j]<temp){ temp = a[j]; } } if(a[i]>temp){ a[i] = temp; } }}
3. 堆排序
3.1 背景介绍
3.1.1 什么是堆?
堆的定义:具有n个元素的序列(k1,k2,k3,……kn),当且仅当满足
或 (i=1,2,3,……,⌊n/2⌋)成为堆。
3.1.2 如何创建堆?
1.找到最后一个有孩子的节点的位置,将父节点的值调整为父节点、左右孩子的最小值。
2.其他节点依次进行
3.2 基本思路
1.输出堆顶元素,然后将堆底元素送入对顶,堆被破坏;
2.将根节点与左右子数较小的元素交换,以此类推
3.3 算法实现
从小到大排序
public static void heapSort(int[] a){ buildHeap(a);//初始堆 for(int i=a.length-1; i>0; i--){ int temp = a[i]; a[i] = a[0]; a[0] = temp; heapAdjust(a, 0, i); }}public static void buildHeap(int[] a){ //最有一个有孩子的节点的位置 i= a.length/2-1 for(int i=(a.length/2)-1); i>=0; i--){ heapAdjust(a, i, a.length); }}public static void heapAdjust(int[] a, int s, int length){ int child = 2*s +1; //child 为左孩子 while (child<length){ if(child+1<length && a[child]<a[child+1]){ ++child; //a[child] 为较大的孩子 } if(a[s]<a[child]){ a[s]= a[child]; s= child; child=2*s+1; } }}
4. 总结
选择排序的过程都是在某个范围内选取最大或最小的值,然后与某个值进行比较交换。堆排序看上去略复杂,但重点在heapAdjust()方法,梳理一下思路就很简单。
0 0
- 八大排序方法解析与巧记(三)选择排序
- 八大排序方法解析与巧记(一)概述
- 八大排序方法解析与巧记(二)插入排序
- 八大排序方法解析与巧记(四)交换排序
- 八大排序方法解析与巧记(五)归并排序
- 八大排序算法(三)简单选择排序
- 八大排序--选择排序
- 八大排序算法(三) Shell排序
- 八大排序之选择排序
- 八大排序之选择排序
- 八大内部排序 -- 选择排序
- 八大排序--简单选择排序
- 八大排序算法之三简单选择排序(c语言)
- Java提高 - 八大排序方法之直接选择排序
- 八大排序实现与简单解析
- 八大排序 --选择排序 之 【堆排序】
- 八大排序算法(四) 直接选择排序
- 八大排序算法(3) 简单选择排序
- Python Flask社区活跃度超过Django
- 关于Java类初始化和实例化中的2个“雷区”
- c/c++ 程序调试方法
- 飞鸽使用的通信协议是什么(未完待续)
- android谷歌官方自带SwipeRefreshLayout实现下拉刷新
- 八大排序方法解析与巧记(三)选择排序
- 将androidVNC项目导入ADT
- Parse Too complex in xxxx.cpp --------source insight
- MVC web NPOI 组件导出EXCLE设置其背景色方法
- 关于pinyin4j
- red hat 安装 mongodb
- addSubView会使内存计数+1
- JAVA程序员最常犯的10个错误
- Java去除掉HTML里面所有标签,