首页 > 编程知识 正文

快速排序算法java,java快速排序算法图解

时间:2023-05-04 00:07:08 阅读:19859 作者:3369

快速排序是冒泡排序的改进版,是最好的内部排序,也是出现在许多问题中,作为程序员必须掌握的排序方法。

快速排序是1962年由无聊的糖豆提出的。 其基本思想是,将排序后的数据用一次排序分割成独立的两个部分,其中一个部分的所有数据小于其他部分的所有数据,然后用该方法分别高速地对两个部分的数据进行排序,从而递归地对整个排序过程进行排序

用图解说明一下这个排序算法吧

假设用户输入了以下数组:

下标

0

1

2

3

4

5

数据

6

2

7

3

8

9

创建变量i=0(指向第一个数据(j=5)指向最后一个数据),k=6(代入第一个数据的值)。

所有小于k的数都向k的左边移动,所以开始寻找小于6的数。 从j开始,从右向左搜索,逐渐减少变量j的值。 我发现第一个下标3的数据小于6。 然后,将数据3移动到下标0的位置,将下标0的数据6移动到下标3,完成第一次比较:

下标

0

1

2

3 4

5

数据

3

2

7

6

8

9

i=0 j=3 k=6

然后,开始第二次的比较,这次要找比k大的东西。 然后,走了再找。 递增变量I时,发现下标2的数据首先大于k,用下标2的数据7和j指向的下标3的数据6进行交换,数据状态如下表所示:

下标

0

1

2

3

4

5

数据

3

2

6

7

8

9

i=2 j=3 k=6

上面两次的比较称为一个周期。

然后,进一步减小变量j,反复进行上述循环比较。

在本例中,如果循环一次,其中I和j指向下标2,则显示为“等待”。 于是,第一次比较结束。 结果如下,所有k(=6)的左边数都小于它,所有k的右边数都大于它。

下标

0

1

2

3

4

5

数据

3

2

6

7

8

9

I和j不见面的话,拿出I找大的,还没有的话,减少j找小的。 重复这个,重复循环。 判断和搜索同时进行。

然后,将k两侧的数据进一步分组,分别进行上述过程,直到不能再分组为止。

注意:次快速排序不会直接得到最终结果,只需将大于和小于k的数分为k两侧。 为了获得最后的结果,必须再次对下标2两侧的数组执行此步骤,并分解数组(只有一个数据),直到数组不能再分解。

以下,我们用动图,请大家耐心阅读

然后用代码实现

打包快速排序; 公共类快速排序{私有统计信息计数; /**测试* @ param args */publicstaticvoidmain (string [ ] args ) int [ ] num={ 3,45,78,64,52,11,64,55,syym 快速排序(num,0,num.length-1 ); system.out.println (array tostring (num,'排序') ); System.out.println ('数组个数: ' num.length ); System.out.println; }/** *快速排序* @param num排序数组* @param left数组的前引脚* @param right数组后引脚*/privatestaticvoidquicksort (int [ ] num,inninteral //数组中小于key的为左,大于key的为右,key值的下标为iint i=left; int j=right; while(ij ) (/j是小于key的值while ) ) num[j]=keyij ) ) j----; (/I )大于key的值while ) num[I]=keyij ) ) I; (/I和j所指元素交换if(ij ) ) {int temp=num[i]; num[i]=num[j]; num[j]=temp; }}num[left]=num[i]; num[i]=key; 出局; 快速排序(num,left,i-1 ); 快速排序(num,i 1,right ); }/** *个int类型数组作为字符串* @ param arr * @ param flag * @ return */privatestaticstringarraytostring (int [ ] arr,String flag ) }返回str; }输出结果如下。

数组为(未排序)。 345786452116455991118数组是)排序)。 311118452564647899排列个数: 11个循环次数: 8

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。