Java常用排序算法之快速排序

快速排序(Quicksort):是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以数组中间元素作为关键数据,赋值给key,即key=A[N/2];
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

public class QuickSort {
    static final int SIZE = 10;

    public static void main(String[] args) {
        int arr[] = new int[SIZE];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 100);
        }
        System.out.println("排序前的数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        quickSort(arr, 0, SIZE - 1);
        System.out.println("快速排序后的数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }


        private static void quickSort(int[] a, int low, int high) {
            if(low<high){ //如果不加这个判断递归会无法退出导致堆栈溢出异常
                int middle = getMiddle(a,low,high);
                quickSort(a, 0, middle-1);
                quickSort(a, middle+1, high);
            }
        }

        private static int getMiddle(int[] a, int low, int high) {
            int temp = a[low];//设置基准值temp
            while(low<high){

                while(low<high && a[high]>=temp){
                    high--;
                }//从后往前找到第一个比基准元素小的元素位置
                a[low] = a[high]; //将其赋值给a[low]
                while(low<high && a[low]<=temp){
                    low++;
                }//从前往后找到第一个比基准元素大的元素位置
                a[high] = a[low];//将其赋值给a[high]
            }
            a[low] = temp;//将本轮基准值赋值给新的a[low]此时比基准值temp小的数都在a[low]左边
                          //比基准值temp大的数都在a[low]右边
            return low;//返回此轮基准值temp的此轮排序后的索引
        }
}

输出:

排序前的数组:
1 43 48 99 21 67 34 17 87 22 
快速排序后的数组:
1 17 21 22 34 43 48 67 87 99
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值