Java算法与数据结构:快速排序,原理及代码详细讲解

跟着黑马的ppt学习了,做下笔记。

快速排序:冒泡排序的改进,先定义分界值,比分界值小的放左边,比分界值大的放右边。然后各自取两边的数组进行递归。

关于Comparable:是一个实现对象支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,我们可以直接用他们的CompareTo ()方法来比较,或者直接对 List<String>或List<Integer> 集合进行排序。支持Integer,所以后面验证的时候可以用Integer定义整数数组。(百度翻译)

如图,以数组第一个元素,6,为分界值(黑马的ppt里截图的,黑马yyds)

 

 

 

函数方法:sort() 入口参数仅为一个数组的,和入口参数为数组、数组左索引、数组右索引的

 Exch()交换数组里两个索引对应变量的值。

patition()  以数组第一个数为基准,分割数组,返回值为分割的索引

CompareSmaller 返回值boolean类型,比较两个数的大小

import javax.swing.*;
import java.util.Arrays;

public class QuickSorting {//快速排序
    public static void sort(Comparable[] UnorderedArray){//入口参数只有一个数组的方法,里面调入口参数 数组,头尾索引的同名方法
        int low = 0;//第一次调的时候,初始 low 和 high ,然后递归调用另一个同名方法
        int high = UnorderedArray.length-1;
        sort(UnorderedArray,low,high);
    }

    private static void sort(Comparable[] UnorderedArray,int Index_low,int Index_high){
        //递归的最开始,给一个条件,防止无限循环
        if (Index_low>=Index_high){
            return;
        }
        int Index_mid = partition(UnorderedArray,Index_low,Index_high);
        sort(UnorderedArray,Index_low,Index_mid-1);
        sort(UnorderedArray,Index_mid+1,Index_high);
    }
    private static int partition(Comparable[] UnorderedArray,int Index_low,int Index_high){
        //先分开,以第一个数为基准
        int Index_Divider = Index_low;
        int Left = Index_low;
        int Right = Index_high+1;
        //不断循环,左找比基准小,右边找比基准大,找到就换
        while (true){//找的时候,左右相遇就停下
            while (CompareSmaller(UnorderedArray[Index_Divider],UnorderedArray[--Right])){
                if (Right<=Left){
                    break;
                }
            }
            while (CompareSmaller(UnorderedArray[++Left],UnorderedArray[Index_Divider])){
                if (Right<=Left){
                    break;
                }
            }
            //两种情况从while中出来,只有找到了值得情况才交换索引处的值
            if (Right<=Left){
                break;
            }else {
                Exch(UnorderedArray,Left,Right);
            }
        }//最后还需要交换 基准值 和 下次分割的基准值
        Exch(UnorderedArray,Right,Index_Divider);
        return Right;
    }
    public static boolean CompareSmaller(Comparable Var_i,Comparable Var_j){
        return Var_i.compareTo(Var_j) < 0;//比较两个变量大小的函数 小于返回true
    }
    public static void Exch(Comparable[] UnorderedArray,int Index_i,int Index_j){
        Comparable InterVar = UnorderedArray[Index_i];
        UnorderedArray[Index_i] = UnorderedArray[Index_j];
        UnorderedArray[Index_j] = InterVar;
    }

    public static void main(String[] args) {
        Integer[] array = {6,7,9,3,2,6,5,7};
        sort(array);
        System.out.println(Arrays.toString(array));
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值