论java快速排序
来源:互联网 发布:单源最短路径算法 编辑:程序博客网 时间:2024/06/08 04:26
public class QuickSort {public static void main(String[] args) {QuickSort sorter = new QuickSort();int src[] = { 10, 9,8,7,6,5,4,3};sorter.quickSort(src, 0, src.length-1, 3);for (int i : src) {System.out.print(i + " ");}}/** * * @param src * @param first * @param last * @param minSortNum * 当最小值为多少的时候不再进行快速排序,而是直接用插入排序来解决 */private void quickSort(int[] src, int first, int last, int minSortNum) {if (last - first + 1 <= minSortNum) {insertSort(src, first, last);return;}int pivotIndex = partition(src, first, last);//对数组实现划分quickSort(src, first, pivotIndex, minSortNum);quickSort(src, pivotIndex + 1, last, minSortNum);}/** * 插入排序的代码 * * @param src * @param first * @param last */private void insertSort(int[] src, int first, int last) {for (int i = first + 1; i <= last - first; ++i) {int temp = src[i];int j = i;while (j > 0 && src[j - 1] > temp) {src[j] = src[j - 1];j--;}src[j] = temp;}}/** * Task:让支点前所有的元素都比支点小,支点后所有的元素都比支点大 * 从第二个元素向右寻找,从倒数第三个元素开始向前寻找(因为支点在之前已经被交换到倒数第二个元素,所以倒数第二个元素无需比较) * * 如果下标为IndexFromLeft的元素小于下标为IndexFromRight的元素,并且IndexFromLeft<IndexFromRight,那么将其交换位置 * 因为向右最终将到达支点处,所以不用考虑出界的问题 * @param src * @param first * @param last * @return支点的下标 */private int partition(int[] src, int first, int last) {int mid = findPivot(src, first, last);int pivotNum = src[mid];//得到支点的数值swap(src, mid, last - 1);//将支点与倒数第二个元素进行交换int indexFromLeft = first + 1;//设置最开始查找的元素为第一个,因为第0个元素一定比支点小int indexFromRight = last - 2;boolean done = false;while (!done) {while (src[indexFromLeft] < pivotNum) {indexFromLeft++;}while (src[indexFromRight] > pivotNum) {indexFromRight--;}if (indexFromLeft < indexFromRight) {swap(src, indexFromLeft, indexFromRight);indexFromLeft++;indexFromRight--;} else {done = true;}}swap(src, last - 1, indexFromLeft);int pivotInex = indexFromLeft;return pivotInex;}//排序两个元素private void sort2Element(int[] src, int one, int two) {if (src[one] > src[two]) {swap(src, one, two);}}/** * 支点为前中后三个元素的排序,将其排序后在中间的元素即为支点,将这三个元素按照大小顺序排序好(进行交换) */private int findPivot(int[] src, int first, int last) {int mid = (first + last) / 2;sort2Element(src, first, mid);sort2Element(src, mid, last);sort2Element(src, first, mid);return mid;}private void swap(int[] src, int one, int two) {int temp = 0;temp = src[one];src[one] = src[two];src[two] = temp;}}
0 0
- 论java快速排序
- 排序-快速排序-Java
- java排序之快速排序
- Java排序算法 快速排序
- 快速排序(java排序)
- java 快速排序,冒泡排序
- 算法:排序----Java快速排序
- 【交换排序】快速排序--Java
- java 插入排序+快速排序
- Java 排序之 快速排序
- java排序之快速排序
- Java排序算法:快速排序
- Java排序-快速排序
- Java排序算法:快速排序
- Java排序算法--》快速排序
- JAVA排序算法---快速排序
- Java 快速排序 归并排序
- Java排序算法--快速排序
- hdu 1043 八数码 A*
- union 与union all
- ParallaxNode视差
- Android内存泄露解读
- linux 查找、替换文件
- 论java快速排序
- Reactor模型
- Bellman-Ford存在负权的最短路径C++实现
- Three Things About Data Science You Won't Find In the Books
- tomcat 7.0
- servlet极简单权限拦截设计处理
- Android Fragment学习之一、Fragment生命周期
- PostgreSQL dblink的使用
- (第三次作业)思考与练习题