算法学习:快速排序算法学习

快速排序算法:每次排序时将第一个元素作为哨兵元素提取出来(空出第一个位置),尾指针从数组后方向前移动,如果指针所指的元素比哨兵元素小,则将元素提取出来放到前面的空位置中,移动后,移动头指针向后移动,如果头指针指向的元素比哨兵元素小则移动到尾指针指向的空位置,循环移动,直到头尾指针相遇,将哨兵元素放到头尾指针相遇的位置,并将数组由哨兵位置分开成两个小数组继续进行快速排序算法。具体实现过程如下图:

具体实现代码如下:(过程可能有些复杂,如有可以优化的地方,请各位大佬指出)

import java.util.Arrays;
import java.util.Random;

public class QuickSort {
    public static void main(String[] args) {
        Random random = new Random();
        int[] arr = new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100)
                , random.nextInt(100), random.nextInt(100),
                random.nextInt(100), random.nextInt(100), random.nextInt(100)
                , random.nextInt(100)};
//        int []arr=new int[]{30  ,83 , 96 , 37 , 62 , 56 , 93  ,45  ,12 };
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
        arr=quickSort(arr);
        System.out.println();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
    }

    private  static int[] quickSort(int[] arr){
        if (arr.length>1){
//            取出第一个元素位哨兵元素,让第一个位置空出来
            int sentry =arr[0];
            arr[0]=0;
//            定义头尾指针
            int headPoint=0;
            int lastPoint=arr.length;
//           定义一个执行次数方便控制循环的指针
            int count =0;
            while(headPoint<lastPoint){
//               循环一次移动尾指针后,一次移动头指针
                if (count%2==0){
                    for (lastPoint=lastPoint-1 ;lastPoint>headPoint;lastPoint--){
//                        如果后方存在比哨兵元素小的的元素则放到前面的空位置中
                        if (arr[lastPoint]<sentry){
                            int temp=arr[lastPoint];
                            arr[lastPoint]=arr[headPoint];
                            arr[headPoint]=temp;
                            count++;
                            break;
                        }
                    }
                }else {
                    for (headPoint=headPoint+1;headPoint<lastPoint;headPoint++){
//                        如果前面的元素比哨兵元素大则放到哨兵元素的后方空位置中
                        if (arr[headPoint]>sentry){
                            int temp=arr[lastPoint];
                            arr[lastPoint]=arr[headPoint];
                            arr[headPoint]=temp;
                            count++;
                            break;
                        }
                    }
                }
            }
//            循环后头尾指针相遇;将哨兵元素放入指针位置
            arr[headPoint]=sentry;
//            将哨兵元素前边数组再次进行快排
            int[] arr1=Arrays.copyOfRange(arr,0,headPoint);
            arr1=quickSort(arr1);
//            将哨兵元素后边数组进行快排
            int[] arr2=Arrays.copyOfRange(arr,headPoint+1== arr.length-1? arr.length-1:headPoint+1,arr.length);
            arr2=quickSort(arr2);
//          将数组重写组合
            arr = merge(arr1, arr2, sentry);
        }
        return arr;
    }
    private static   int[]  merge(int[]headArr,int[]lastArr,int mid){
        int[] newArr=new int[headArr.length+lastArr.length+1];
        for (int i = 0; i < headArr.length; i++) {
            newArr[i]=headArr[i];
        }
        newArr[headArr.length]=mid;
        for (int i =0; i < lastArr.length ; i++) {
            newArr[i+headArr.length+1]=lastArr[i];
        }
        return newArr;
    }
}

运行效果如图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值