1 .算法基础 快速排序

快速排序:随便找一个目标值 ,放在数组的某个下标 ,使得该下标左侧度小于目标值 ,下标右侧大于目标值.

 

 

接下来  为 1  4  5  2  6  7  8  

分析 : 6为目标值 6的左边 是 1  4  5  2 符合概念 ,左侧都是小于目标值的 ,右侧 7 8 符合 右侧大于目标值 ,现在讲 6 左侧 ,和右侧 ,看成两个新的数组 .

    第一个数组 1  4  5  2

    第二个数组  7  8

 

排序第一个 

   1.找到目标值 以第一个为例 目标值为 1 定义 i 和 j  ,i=下标0 ,j =数组长度,也就是数值为2的下标

   2. 此时判断 第一个数组 是否满足条件 目标值右侧 是大于目标值的吗 , 向 1 4 5 2 符合条件 ,所以分成新的数组 4  5  2 ,进行排序.

   3.     4  5  2 ,   目标值是4,从j开始向前走 , j找比 目标值4小的数 ,走到了 头 ,没有相遇了 i 交换位置   ,2 4 5 条件符合  ,

        左侧 为 1  2   4   5  

第二个数组 :7  8  符合 条件 

排序完成 

1   2  4   5  6  7  8

总结 :思路不是特别清晰 ,总体来说 ,选择一个目标值 ,使其左侧都是小于 目标值的 ,右侧 都是大于目标值的 , 左侧第一个为目标值 ,要从 右侧第一个 开始 走 , 当右侧找到 小于目标值的数 停在那里 ,然后左侧 走 ,当左侧 走到大于小于目标值的 数 停住 ,两个数 互换位置 ,(前提是两个数 不相遇) ,相遇即代表 一次排序完成 ,表示 目标值左侧都是小于它的 ,右侧都是大于它的 ,将目标值 左侧和右侧 分为两个数组 ,在从第一个步骤开始开 ,依次循环.

 

 

附上 java代码:

package com.ivying;

import android.util.Log;

/**
 * author : Majunbao
 * github : https://github.com/MaJunBaox
 * time   : 2019/9/20 13:47
 * desc   : 算法 基础 快速排序
 */
public class Demo {

    /**
     * 方法
     * @param array 数组
     * @param left 数组最左边下标
     * @param right 数组最右边下标
     */
    public static  void quickSort (int[] array , int left ,int right){
        //防止下标越界
        if (left >= right) {
            return;
        }

        /**
         * 1.定义基准数 (默认基准数为数组下标为0的数)
                * 2.找到最左边第一个 i
         * 3.找到最右边 j
         * 4.用于交换的临时变量
                */

        int base = array[left];
        int i = left;
        int j = right;
        int temp;

        while (i != j){
            while (array[j] >= base && i < j) {
                j--;
            }

            while (array[i] <= base && i<j) {
                i++;
            }

            if (i < j) {
                temp = array[i];
                array[i] = array[j];
                array[j] =temp;
            }
        }

        array[left] =array[i];
        array[i] = base;


        quickSort(array ,left , i-1);
        quickSort(array , i+1 , right);

        for (int z = 0; z < array.length; z++) {
            Log.d("liuyi",   "排序后:"+array[z]);
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值