java实现快速排序

摘要:
java中快速排序算法的思想是选择一个元素作为基数,并设置左指针和右指针。右指针从右到左查找小于基数的数字,左指针从左到右查找大于基数的数字。当两个指针重叠时,基数的位置就是基数的位置。此时,左侧的所有元素都小于元素,右侧的所有元素均大于元素。然后递归地让左侧和右侧分别执行操作,最后使整个数组有序。

java实现快速排序

算法思路

选定一个元素作为基准数(一般用中数),设置左右两个指针,右指针从右往左找比基准数小的数,左指针从左往右找比基准数大的数,两个指针重叠时的位置就是基准数的位置,此时左侧所有元素都小于该元素,右侧所有元素都大于该元素。然后递归的让左侧和右侧分别执行该操作,最终让整个数组变得有序。

代码实现

import java.util.Arrays;
import java.util.Scanner;

public class QuickSort {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一组数字(以空格分开):");
        String[] data = sc.nextLine().split(" ");
        int[] arr = new int[data.length];
        for(int i = 0; i < data.length; i++){
            arr[i] = Integer.valueOf(data[i]);  // 输入不定长度的数组
        }
        long sTime = System.nanoTime();
        quickSort(arr);
        long eTime = System.nanoTime();
        System.out.println(Arrays.toString(arr));
        System.out.println("耗时:" + (eTime-sTime) + "ns");
        sc.close();
//      int[] testArr = {1, 4, 6, 7, 6, 6, 7, 6, 8, 6};
//      int[] testArr = {7, 3, 1, 5, 4, 6};
//      int[] testArr = {7, 6, 5, 4, 3, 2};
    }

    public static void quickSort(int[] oArr) {
        quickSort(oArr, 0, oArr.length-1);
    }

    private static void quickSort(int[] oArr, int left, int right) {
        int i = left;
        int j = right;
        int mid = (i+j+1)/2;
        int pivot = oArr[mid];

        oArr[mid] = oArr[i];
        while (i < j) {
            while (oArr[j] >= pivot && i < j) {
                j--;
            }
            if (i < j) {
                oArr[i++] = oArr[j];
            }
            while (oArr[i] < pivot && i < j) {
                i++;
            }
            if (i < j) {
                oArr[j--] = oArr[i];
            }
        }
        oArr[i] = pivot;

        if (left < i-1) {
            quickSort(oArr, left, i-1);
        }
        if (i+1 < right) {
            quickSort(oArr, i+1, right);
        }
    }

}

延伸阅读

基础算法实践: https://github.com/AlbertKnag/algs-practice

快速的三向切分:https://www.jianshu.com/p/779bc4b61254

三种快速排序以及快速排序的优化:https://blog.csdn.net/insistgogo/article/details/7785038


小知识

1、for (int x : arr)

int[] testArr = {7, 3, 1, 5, 4, 6};
for (int x : testArr) {
    System.out.print(x + " | ");
}

这种有冒号的for循环叫做foreach循环,这样遍历数组元素更方便

见:https://www.cnblogs.com/yangyi9343/p/4751413.html

2、eclipse批量修改变量名

双击变量名,右键选择Refactor下的Rename...

见:https://jingyan.baidu.com/article/7c6fb4281cde5880642c90a0.html

免责声明:文章转载自《java实现快速排序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SAP EPIC 银企直连+TRM资金管理 + EPIC常用表, SAP EPIC 和F110 冲突unity中读写二进制文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

对字符串进行快速排序(即字符数组排序)

package com.cn.gao; import java.util.Scanner; //对字符串进行快速排序 public class CharsQuickSort { public static final int SIZE=100; //可以输入的最大字符数 //快速排序的一次划分 public s...

python中的快速排序

       在工程实际中,经常需要将python代码转化成c++代码,为了获得一样的结果,需要保证算法的一致性。最近在目标检测的算法中,发现python默认排序算法为改进版的快速排序,描述如下: * Quick sort is usually the fastest, but the worst case scenario is O(N^2) so *...