首页 > 编程语言 > 详细

java实现快速排序

时间:2019-06-04 18:50:04      阅读:170      评论:0      收藏:0      [点我收藏+]

算法思路

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

代码实现

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实现快速排序

原文:https://www.cnblogs.com/lanselove/p/10975159.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!