首先快速排序:就是选择一个基数,然后从两端依次进行比较,若右边大于基数,则不进行交换,直到右边的数据小于基数,然后冲左边开始和基数比较,若左边的小于基数,则进行下一个比较,直到左边的数据大于基数才进行比较。循环的跳出条件是左边的数组号大于或者等于右边的数组号。
实例数组是:23 34 56 78 65 90 88 92 18 21
首先以23作为基数,则进行比较时,从右边开始,21和23比较,21小于23,所以,把21放到23的位置。结果为21 34 56 78 65 90 88 92 18 【】。
然后从左边开始和基数23比较,21小于23,向右移一位,low位+1,用34和23比较,发现34大于23,则把34放到上次移动后的位置【】,
这次交换后的排序结果是: 21 【】 56 78 65 90 88 92 18 34,
接着继续从右边开始比较,34大于23,向左移一位,high减一,使用18和23比较,18小于23,把18放到上次34移走后的位置,结果为: 21 18 56 78 65 90 88 92 【】 34,
接着再从左边开始进行比较,18小于23,56大于23,所以把56移位到上次18移走后的位置【】处,结果为:21 18 【】 78 65 90 88 92 56 34,
接着再从右边开始比较,发现56,92,88,90,65,78都比23大,比较完后没有需要移动的,且从左边开始比较的坐标和冲右边开始比较的坐标一样,两边碰面了,则这次比较就结束了,
最终把基数放到最后【】处的位置即可。
比较一次结束,可以唯一确定一个数据的最终位置,比如这次排序后,基数23的位置以确定了的,其他的数据属于待排状态,以基数为分界线,把基数两边的数据按照统一的规则进行排序,直到排序出最终结果位置。
快速排序的Java实现代码如下所示:
package com.class02; /** * 快速排序: * @Date: 2019/3/23 9:55 * @Version: 1.0 */ public class QucikSortTest { static int a[] = {23,34,56,78,65,90,88,92,18,21}; public static void Sort(int a[],int low,int high){ int stand=0; if(low<0||high<0||low>high||low>=a.length)return; stand=getMid(a,low,high); if(low<high){ Sort(a,stand+1,high); Sort(a,low,stand-1); } } public static int getMid(int a[],int low,int high){ int stand=a[low]; while(low<high){ while(low<high&&a[high]>=stand)high--; a[low]=a[high]; while(low<high&&a[low]<=stand)low++; a[high]=a[low]; } a[low]=stand; show(a); return low; } public static void show(int a[]){ for(int i=0;i<a.length;i++){ System.out.print(" "+a[i]); } System.out.println(); } public static void main(String []args){ System.out.println("排序前的数据序列为:"); QucikSortTest.show(a); System.out.println("-----------------------------------------"); QucikSortTest.Sort(QucikSortTest.a,0,9); System.out.println(); System.out.println("排序后的数据序列为:"); QucikSortTest.show(a); } }
程序的运行结果如下所示: