排序算法总结(下)
来源:互联网 发布:四川大学网络教学 编辑:程序博客网 时间:2024/06/03 18:59
4.堆排序
- 思路:堆就是一个完全二叉树(小顶堆),
- 主要解决两个问题:
- 如何将n个待排序的数构建成堆
- 输出堆顶元素之后如何调整剩下的n-1个元素,使之成为新的堆
- 时间复杂度:O(nlogn)
代码实现:
private static class HeapSort { public HeapSort(int a[]) { buildMaxHeapify(a); heapSort(a); System.out.println(""); System.out.println("****4.堆排序之后:****"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + ","); } } // 构建初始最大堆 // 假设长度为8 那么 // 第一个父节点就是a[3] 左结点为:a[7] // 第二个父节点为:a[1] 左节点为:a[3] 右结点为:a[4] // 第三份父节点为:a[2] 左节点为:a[5] 右结点为:a[6] public static void buildMaxHeapify(int a[]) { System.out.println("字符串的长度为:" + a.length); int startIndex = getParentIndex(a.length - 1); for (int i = startIndex; i >= 0; i--) { maxHeapify(a, a.length, i); } } /** * * @param a * 数组 * @param length * 数据长度 * @param index * 当前的父节点 */ private static void maxHeapify(int[] a, int length, int index) { // 与当前左右结点进行比较 int left = getChildLeftIndex(index); int right = getChildRightIndex(index); // 进行左右节点值的对比 int largest = index; if (left < length && a[left] > a[index]) { largest = left; } if (right < length && a[right] > a[largest]) { largest = right; } if (largest != index) { int temp = a[index]; a[index] = a[largest]; a[largest] = temp; // 整理节点 maxHeapify(a, length, largest); } } // 父节点的位置 private static int getParentIndex(int i) { return i / 2; } // 左孩子的位置 private static int getChildLeftIndex(int index) { return index * 2 + 1; } // 右孩子的位置 private static int getChildRightIndex(int index) { return index * 2 + 2; } /** * 这个函数的含义就是: 将排好的最大堆的堆顶和最后一个交换再进行最大堆排序 排序:最大值放在末尾,再次进行排序 * * @param a */ public static void heapSort(int a[]) { for (int i = a.length - 1; i > 0; i--) { int temp = a[0]; a[0] = a[i]; a[i] = temp; maxHeapify(a, i, 0); } } }
5.冒泡排序
- 思路:就是不断的两两比较
- 时间复杂度:O(n^2)
代码实现
private static class BubbleSort { //简单的冒泡排序 public static void bubbleSort_A(int a[]) { for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length-i- 1; j++) { if (a[j] > a[j + 1]) { Swap(a, j, j + 1); } } } } //改进的冒泡,添加了标记 public static void bubbleSort_B(int a[]){ int n = a.length-1; while(n>0){ int pos = 0; for (int i = 0; i < n; i++) { if(a[i]>a[i+1]){ pos = i; Swap(a, i, i+1); } } n = pos; } } }
6.快速排序
- 思路:
- 选择一个基准元素
- 通过一次快排序将待排序数分为两个部分,一部分比基准数小,一部分比基准数大
- 然后接着对这两部分进行相同的操作,直到序列有序
- 时间复杂度:O(nlogn)
- 空间复杂度: O(nlogn)
快速排序代码
private static class QuickSort{ public static void quickSort(int a[],int low,int high){ if(low<high){ int privotLoc = partition(a,low,high); quickSort(a, low, privotLoc-1); quickSort(a, privotLoc+1, high); } } private static int partition(int[] a, int low, int high) { int privotKey = a[low]; while(low<high){ while(low<high && a[high]>=privotKey)--high;//从后半部分向前扫描 a[low] = a[high]; while(low<high && a[low]<=privotKey)++low; //从前部分扫描 a[high] = a[low]; } a[high] = privotKey; return low; } }
0 0
- 排序算法总结(下)
- 算法--排序算法总结
- 算法:排序算法总结
- 算法:排序算法总结
- 算法-排序算法总结
- 算法-排序算法总结
- 【排序算法】排序算法总结
- 总结下排序算法——MoreWindows白话经典算法之七大排序总结篇
- 排序算法总结---希尔排序
- 排序算法总结---冒泡排序
- 排序算法总结----快速排序
- 排序算法总结---希尔排序
- 排序算法总结【内排序】
- 排序算法之内排序总结
- 排序算法总结:冒泡排序
- 【排序算法总结】冒泡排序
- 【排序算法总结】选择排序
- 排序算法总结
- 关于利用itchat模块编写的微信自动回复
- CKEditor与CKFinder学习--浅谈CKFinder源码修改自定义上传文件名
- 删除service中的服务名称( SC OpenService 失败5:拒绝访问)
- (转载)Ubuntu上配置caffe+SSD及demo演示(附带问题汇总)
- Matlab 文件操作(转载http://www.cnblogs.com/longdouhzt/archive/2013/01/29/2881749.html)
- 排序算法总结(下)
- ARM Volatile关键字 NPN和PNP区别
- 5-71 最佳情侣身高差 (10分)
- Java基础
- 线索化二叉树
- HDU 2500 JAVA
- join连接的五种方式的简单使用案例(Inner join,Left join,Right join,Full join,Cross join)
- oracle 将字符串分隔方法
- MvvmCross .net standed修改版,支持最新的VS2017