快速排序原理及Java代码实现

news/2024/5/19 23:51:32 标签: 快速排序, java, 数据结构, 算法

这个本来是我大二应该写的博文,没想到却是因为大四找工作复习才回来写。。

对于初学者的经验就是,按照代码,自己拿一个数组动手操作一遍就能懂了。本来大二死记硬背的东西,现在经过考研过后,原理掌握清楚了,自己现在就可以自然而然的写出来。所以我个人觉得,真正理解原理才是最重要的。

原理:利用递归。每一次递归,我们都会取数组当中的一个数(这个数是随机的,不过大多数教材都喜欢取未排序的数组的第一个数)当作枢纽。在每一次的递归后,这个枢纽都会被放在它最后排序好的位置。它的左边,全都是比它小的数;它的右边,全都是比它大的数。接下来,我们就把该枢纽左边的数当作信新的数组再次进行递归;右边的数,同样当作新的数组进行递归。经过多次递归之后,粒度慢慢变小,最终就可以达到我们想要的结果。

乍一看真的很像归并排序,对吧。

原理清楚了,下面就看代码的实现。

这个函数是用来交换数组的两个数的位置的:
    public static void swap(int[] array,int index1,int index2)
    {
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }
//这个函数为递归的主体
    public static int[] QuickSort(int[] array,int low,int high)
    {
        if(low < high)
        {
            int pivot = Partion(array,low,high);
            //每次经过Partition这个函数,都会又一个数放在正确的位置上,pivot是枢纽的位置
            
            QuickSort(array,low,pivot-1);
           //把枢纽左边的这些数,当成新的数组进行递归

            QuickSort(array,pivot+1,high);
            //把枢纽右边的这些数,当成新的数组进行递归
        }
        return array;
        //此时返回的数组是已经排序好了的数组
    }
//该函数的作用就是把枢纽放到正确的位置上
    public static int Partion(int[] array,int low,int high)
    {
    //这里的low和high我喜欢把它们叫做指针,low目前指向数组最左边的位置,high目前指向数组最右边的位置
    
        int pivot = array[low];
		//取该未排序的数组的第一个数当作枢纽

        while(low < high)
        {
            while(low < high && array[high] > pivot)
                high--;
			//当high指针所指的数大于枢纽的值时,我们认为它满足条件,移动指针的位置即可

            swap(array,low,high);
			//能够到这一步,代表,现在high指针指向的数,是小于枢纽的,不符合规定。我们将low和high指向的两个数进行交换;另一种可能就是所有的数均符合规定,此时low=high


            while(low < high && array[low] < pivot)
                low++;
			//当low指针所指的数小于枢纽的值时,我们认为它满足条件,移动指针的位置即可

    
            swap(array,low,high);
            //能够到这一步,代表,现在low指针指向的数,是枢纽的,不符合规定。我们将low和high指向的两个数进行交换;另一种可能就是所有的数均符合规定,此时low=high
        }

        return low;
        //此处说明,low和high所指向的位置是重合的。它们重合的这个位置,救赎枢纽所在位置。
    }

下面是全部代码的整合,没有注释,仅提供运行

public class Practie
{
    public static void main(String[] arg)
    {
        int[] array = {6,5,4,3,2,1};
        array = QuickSort(array,0,array.length-1);
        for(int i=0;i<array.length;i++)
        {
            System.out.println(array[i]);
        }
    }
    public static void swap(int[] array,int index1,int index2)
    {
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }

    public static int[] QuickSort(int[] array,int low,int high)
    {
        if(low < high)
        {
            int pivot = Partion(array,low,high);
            QuickSort(array,low,pivot-1);
            QuickSort(array,pivot+1,high);
        }
        return array;
    }

    public static int Partion(int[] array,int low,int high)
    {
        int pivot = array[low];
        while(low < high)
        {
            while(low < high && array[high] > pivot)
                high--;
            swap(array,low,high);
            while(low < high && array[low] < pivot)
                low++;
            swap(array,low,high);
        }

        return low;
    }
}

结尾不知道自己想说什么,自己还能说什么。
不管是考研失败还是现在工作还没有下落。每天给自己加油,也其实没什么用。但是不管自己现在如何,只有努力才能继续往下走。自己如果都不相信自己,那就没有人可以相信自己了。


http://www.niftyadmin.cn/n/937750.html

相关文章

volatile 简介

volatile volatile是一个类型修饰符&#xff08;type specifier&#xff09;。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile&#xff0c;基本上会导致这样的结果&#xff1a;要么无法编写多线程程序&#xff0c;要么编译器失去大量优化的机会。 简单地说就…

架构业务wait和sleep区别狭义jiavaBean规范,三层架构模式

在写这篇文章之前&#xff0c;xxx已经写过了几篇关于改架构业务主题的文章,想要了解的朋友可以去翻一下之前的文章 每日一道理 聪明人学习&#xff0c;像搏击长空的雄鹰&#xff0c;仰视一望无际的大地&#xff1b;愚笨的人学习&#xff0c;漫无目标&#xff0c;犹如乱飞乱撞的…

Python爬取CNKI论文的信息

学了2天&#xff0c;简单的来总结一下。因为毕业设计是有关于推荐系统的相关内容&#xff0c;利用python爬取文献库是里面最基础的一步。 代码无任何难度&#xff0c;不懂得直接复制代码上网查询也能明白具体代码的意思。 选择CNKI的原因很简单&#xff1a; 1、知网的网页源代…

管理用户和PROFILE ——管理PROFILE——使用PROFILE管理口令

当访问oracle数据库时&#xff0c;必须提供用户名和口令&#xff0c;然后才能连接数据库。为防止其他人员或黑客窃取用户口令&#xff0c;dba必须充分考虑用户口令的安全性&#xff0c;以防止黑客登录到数据库运行非法操作。对于大型数据库管理系统来说&#xff0c;数据库用户众…

AT指令说明

AT指令说明 1&#xff0e;通用指令 AT指令 说明 ATCGMI 厂家认证请求&#xff0c;返回模块厂家信息 ATCGMM 模式认证请求&#xff0c;返回模块使用频段 ATCGMR 修正认证请求&#xff0c;返回软件版本 ATCGSN 查看产品IMEI序列号 ATCSCS 选择TE特性设置 ATWPCS 选择…

使用maven创建的第一个Spring项目:使用JdbcTemplate模板连接mysql数据库

maven目前已经成为项目管理的最常用的工具之一&#xff0c;使用maven可以尽最大程度的解决管理项目的各种依赖的问题。 本次所做的项目&#xff0c;就是使用jdbcTemplate模板实现对数据库相应数据的查询。数据库表结构如下图所示&#xff1a; 目前的步骤分为一下几步&#xf…

你我他的大学生活

大学生活对于所有的高中生来说&#xff0c;都是神秘而向往的&#xff0c;而当我们走进了大学校园之后&#xff0c;脑海中对于大学的梦与现实的差距之大会让很多很多学生怀念以往高中的时光&#xff0c;怀念以前有着一个坚定的目标&#xff0c;一直去努力&#xff0c;去奋斗&…

09、AppBarControl

1、Basics: 这个示例主要演示了一个基本的 AppBar 控件。显示 AppBar 的方法&#xff1a; 用手轻划屏幕的顶部或者底部&#xff0c;或者右键单击鼠标&#xff0c;或者快捷方式 win键 Z。轻划其它部分便可以隐藏 AppBar。 系统按钮样式资源 底部按钮: <Page.BottomAppBar>…