Java常用排序算法(二):选择排序
2016-03-23 22:58
555 查看
一.简单选择排序:基本思路: 遍历序列, 把最大值放置在序列的第一位, 次最大值放置在第二位一直循环到最后一位跟倒数最后一位的比较为止.实例:初始序列:34, 08, 23, 99, 12, 34第一次排序:99, 34, 08, 23, 12, 34第二次排序:99, 34, 08, 23, 12, 34第三次排序:99, 34, 34, 08, 23, 12第四次排序:99, 34, 34, 23, 08, 12第五次排序:99, 34, 34, 23, 12, 08 (排序完成)分析:效率为O(n^2), 适合与小序列排序.代码实现:
<strong><span style="color:#33cc00;"><span style="white-space:pre"> </span>public void selectSort(int[] arr) {for(int i=0; i<arr.length-1; i++) {int min = arr[i];for(int j=i+1; j<arr.length; j++) {if(arr[j] < min) {// 交换int temp = arr[j];arr[j] = min;min = temp;}}arr[i] = min;}}</span></strong>2.堆排序要理解堆排序要先理解何为堆:具有n个元素的序列k1, k2, ... , kn, 当且仅当满足ki>=k(2i)且ki>=k(2i+1)或 ki<=k(2i)且ki<=k(2i+1), 1<= i<=n/2, 成为堆(heap).分别称为大根堆和小根堆.根据堆(大根堆)的定义, 可以把堆看作是父结点的元素均大于其左右子结点的完全二叉树.对于大根堆, 其堆顶(即树根)的元素最大, 每次取出堆顶, 再重新排放序列就能完成排序基本思路: (1)将序列创建成大根堆(2)每次取出堆顶元素, 此时堆的结构可能被破坏, 就需要重新建堆(3)一直循环至最后一个元素, 排序完成代码实现:
<strong><span style="color:#33cc00;"><span style="white-space:pre"> </span>/*** 堆排序* @param arr*/public static void headSort(int arr[]) {// 创建最大堆buildMaxHead(arr);for(int i=arr.length-1; i>=1; i--) {// 把最大数放置到数组尾swap(arr, 0, i);// 重新构建最大堆heapity(arr, 0, i);}}/*** 创建最大堆* @param arr*/private static void buildMaxHead(int arr[]) {int len = arr.length;// 遍历树结点, 总共有len/2个for(int i=len/2; i>=0; i--) {heapity(arr, i, len);}}/*** 堆化*/private static void heapity(int arr[], int currentIndex, int maxIndex) {int left = 2*currentIndex+1; // 左孩子索引int right = 2*currentIndex+2; // 右孩子索引int largestIndex = currentIndex; // 记录父结点与其孩子之间最大值的索引// 若存在左孩子并其值大于父结点if(left < maxIndex && arr[left] > arr[currentIndex])largestIndex = left;// 若存在右孩子并其值大于父结点if(right < maxIndex && arr[right] > arr[largestIndex])largestIndex = right;if(largestIndex != currentIndex) {// 把最大值作为父结点swap(arr, largestIndex, currentIndex);// 递归heapity(arr, largestIndex, maxIndex);}}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}</span></strong>
相关文章推荐
- Java SE、Java EE、Java ME 简介
- There is no getter for property named 'id' in 'class java.lang.Integer'
- java_patest甲级真题1002. A+B for Polynomials
- Spring AOP 闲谈
- java.lang.UnsatisfiedLinkError: Unable to load library 'xxx': Native library (win32-x86-64/ID_Fpr.dll)
- java_patest甲级真题1001. A+B Format
- java第12天
- Java学习之CAS
- java map 里面判断相等的hashcode方法
- JAVA实现计数排序(牺牲稳定性,换取空间复杂度)
- Invalid project description. xxxx overlaps the location of another project: ‘xxx’
- java多线程2-总结
- java垃圾回收机制
- IO和NIO的区别
- java多线程1-生产者与消费者
- Java编程--关于JNI你应该知道的一切
- java.util.NoSuchElementException
- java线程同步简单例子
- Spring 源码分析(四) ——MVC(二)概述
- Java判断素数