Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
来源:互联网 发布:单片机难吗 编辑:程序博客网 时间:2024/06/10 12:28
/** 包含多种静态排序方法 * Created by Andre on 2016/6/27. */public class Sorter { /** * 快速排序 * 递归形式 * 第一个记录为枢轴 * 不稳定 * @param a 需要排序的数组 * @param low 数组的起始下标 * @param high 数组的结束下标 */ public static void QuickSort(int a[], int low, int high) { if(low >= high) return; int pivot = a[low], l = low, h = high; for(; l < h; ) { for(; l < h && a[h] >= pivot; h--); a[l] = a[h]; for(; l < h && a[l] <= pivot; l++); a[h] = a[l]; } a[l] = pivot; QuickSort(a, low, l - 1); QuickSort(a, l + 1, high); } /** * 快速排序 * 递归形式 * 第一记录为枢轴 * @param a 需要排序的数组 */ public static void QuickSort(int a[]) { QuickSort(a, 0, a.length-1); } /** * 二路归并排序 * 递归 * 稳定 * @param a 需要排序的数组 * @param low 数组的起始下标 * @param high 数组的结束下标 */ public static void MergeSort(int a[], int low, int high) { if(low >= high) return; int mid = (low + high) / 2; MergeSort(a, low, mid); MergeSort(a, mid + 1, high); int[] b = new int[high - low + 1]; int i, j, k = 0; for(i = low, j = mid + 1; i <= mid && j <= high; ){ if(a[i] < a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i <= mid) b[k++] = a[i++]; while(j <= high) b[k++] = a[j++]; while(low <= high) a[high--] = b[--k]; } /** * 二路归并排序 * 递归 * @param a 需要排序的数组 */ public static void MergeSort(int a[]) { MergeSort(a, 0, a.length-1); } /** * 堆排序 * 不稳定 * @param a 需要排序的数组 */ public static void HeapSort(int[] a){ for(int i = a.length / 2; i > 0 ; i--) percDown(a, i, a.length); for(int i = a.length-1; i > 0; i--) { int tem = a[0]; a[0] = a[i]; a[i] = tem; percDown(a, 0, i); } } /** * 堆的下滤操作 * @param a 需要排序的数组 * @param i 下滤的位置 * @param n 堆的大小 */ public static void percDown(int[] a, int i, int n) { int tem = a[i]; for(int child = 2 * i + 1; child < n; i = child, child = 2 * child + 1) { if(child != n-1 && a[child] < a[child+1]) child++; if (tem < a[child]) a[i] = a[child]; else break; } a[i] = tem; } /** * 希尔排序 * 增量序列为 a.length / 2, a.length / 4, ... 1 * 不稳定 * @param a 需要排序的数组 */ public static void ShellSort(int[] a) { for(int gap = a.length / 2; gap > 0; gap /= 2) { for(int i = gap; i < a.length; i++) { int tem = a[i], j; for(j = i; j >= gap && tem < a[j - gap]; j -= gap) a[j] = a[j - gap]; a[j] = tem; } } }}
0 0
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 关于快速排序和插入排序最坏时间复杂度为O(nlogn)的算法
- 排序算法:希尔、归并、快速、堆排序
- 排序算法:希尔、归并、快速、堆排序
- 快速排序[平均时间复杂度O(NlogN)]
- 归并排序、快速排序---时间复杂度为O(nlog n)的排序方式
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- java排序算法二分法 希尔排序 快速排序 归并排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 堆排序复杂度为O(nlogn),需要注意的误区
- 插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序(希尔排序,堆排序,归并排序,快速排序)
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- Java高级排序(希尔排序,快速排序,堆排序,归并排序,桶排序)
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 【VC小项目】-13.1动物可以这样叫
- 矩形覆盖
- centos7下安装tomcat8笔记(不适用于生产环境)
- c语言学习笔记41
- java语言程序设计基础篇第一章编程练习题
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- leave-one-out之个人理解
- 千万不要看—思路火花
- windows中如何进行分区
- Linux安装MySQL的两种方法
- java中static作用详解
- 正则表达式之道
- 约瑟夫问题线段树
- 线段树插队。。题目有点忘了、、