算法-快速排序

1.思路:在数组中找一个值作为中间值key,然后从数组右边开始向左边寻找小于key值放到key的左边,同时从数组的左边向右边寻找大于key值放到key的右边(时间复杂度nlogn);
2.具体步骤:
(1)定义全局变量i,赋值等于start 
(2)定义全局变量j,赋值等于end 
(3)定义key值,等于array[i] 
(4)后面会交换array[i]和array[j]值,同时i会不断增加,j会不断减小,所以只要i<j,都会循环处理 
(5)从下标为j开始,向下走,直到找到比key值小的值的下标(目标是找到比key值小的值,交换到key左边) 
(6)同时设置array[i]位置的值为找到比key小的值(i位置装小于key的值了,所以要做i++操作,下次相当于操作i+1) 
(7)从下标为i开始,向上走,直到找到比key值大的值的下标(目标是把比key大的值,交换到key的右边) 
(8)同时设置array[j]值等于i找到的大值,同事j--,因为j位置存放了新值,下次就相当于操作j-1 
(9)每轮找一个小于key的值,再找一个大于key的值,进行交换,只要i<j还成立,循环执行轮操作 
(10)最后结束了i肯定=j了,所以设置array[i]=key,中间值 
(11)递归操作[start,key下标-1]部分数据,小于key部分的,满足条件是start<key下标-1 
(12)递归操作key下标+1,end部分,大于key部分的,满足条件是end>key下标+1
3.代码例子:
例子:
/**
 * @Author: hs
 * @Description: 快速排序
 * @Date: 2021-01-28 17:36
 */
public class quickSort {

    public static void main(String[] args) {//任意定义一个数组
        int[] array = {10, 8, 7, 3, 7, 29, 15, 56, 5};
        System.out.println(Arrays.toString(array));
        QuickSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }

    /*需要递归处理*/
    public static int[] QuickSort(int[]array,int start,int end){
        int i = start;
        int j = end;
        int key = array[i];
        while (i<j){
            //循环找一个比key小的值
            while (i<j&&array[j]>key){
                j--;
            }
            //找到了设置array[i]值为找到的小值
            if(i<j){
                array[i] = array[j];
                i++;
            }
            //循环找一个比key大的值
            while (i<j&&array[i]<key){
                i++;
            }
            if(i<j){
                array[j] = array[i];
                j--;
            }
        }
        array[i] = key;
        if(start<i-1){
            QuickSort(array,start,i-1);
        }
        if(end>i+1){
            QuickSort(array,i+1,end);
        }
        return array;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值