Java排序算法之快速排序
来源:互联网 发布:禁止安装任何软件方法 编辑:程序博客网 时间:2024/05/25 21:32
快速排序思想
按照a[lo] 的值v切分,指针i和j相遇时主循环退出;
a[i]小于v时,i+1
a[j]大于v时,j-1
交换a[i], a[j] 保证 i 左侧均小于等于v,j右侧均大于等于等于v。
当指针相遇时交换a[lo], a[hi], 切分结束。切分值留在a[j] 中。速度快,非稳定排序
时间复杂度是nlogn,空间复杂度logn
快速排序算法的关键在于:
先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动数组的左边,比选择的数字大的数字移到数组的右边
Java实现
public class Sort { public static void main(String[] args) { int[] arr = { 5, 1, 9, 3, 7, 4, 8, 6, 2 }; System.out.println("排序之前:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } sort(arr); System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } /** * 快速排序 * @param a */ public static void sort(int[] a) { sort(a, 0, a.length - 1); } private static void sort(int[] a, int lo, int hi) { if (hi <= lo) return; int j = partition(a, lo, hi); // 切分,排序的核心 sort(a, lo, j - 1); // 左半部分排序 sort(a, j + 1, hi); // 右半部分排序 } private static int partition(int[] a, int lo, int hi) { int i = lo, j = hi + 1; int v = a[lo]; while (true) { while (a[++i] < v) // 找到左侧大于v的第一个值的下标i if (i == hi) break; while (a[--j] > v) // 找到右侧小于v的第一个值的下标j if (j == lo) break; if (i >= j) // i,j两指针相遇时主循环退出 break; exch(a, i, j); // 交换a[i],a[j] } exch(a, lo, j); // 切分结束,切分值留在a[j] return j; } private static void exch(int[] a, int lo, int hi) { int temp = a[lo]; a[lo] = a[hi]; a[hi] = temp; }}
0 0
- java算法之快速排序
- java算法之快速排序
- Java算法之快速排序
- java算法之快速排序
- 排序算法之快速排序(JAVA)
- Java排序算法之快速排序
- 排序算法之快速排序Java版
- Java实现排序算法之快速排序
- 排序算法之快速排序(Java)
- Java常用排序算法之快速排序
- 排序算法之快速排序-Java-version
- java基本排序算法之快速排序
- 排序算法之快速排序 Java实现
- 排序算法之快速排序java实现
- 排序算法之快速排序(Java)
- Java排序算法之快速排序
- Java排序算法之快速排序
- Java排序算法之快速排序
- HDU3486 二分+RMQ
- 编译运行内核里面的helloworld以及使用递归计算阶乘
- OpenGL函数封装:在任意两个三维点之间绘制给定半径的圆柱体管道
- 增强现实
- 【51NOD 1239】欧拉函数之和
- Java排序算法之快速排序
- webpack loader一览
- cocos2dx-2.2.3下载地址
- 自动化测试入门
- lightoj1018
- 第二次上机实验报告
- 聚类算法(一)
- 天梯赛抢红包与PAT judge
- 55. Jump Game