您的位置:首页 > 编程语言 > Java开发

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: