快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是A[1]…A[n-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
import java.util.Arrays; public class sx8{ public static void main(String[] args) { /* 快速排序 */ int[] arr={10,30,25,79,40,32,6,25}; //上面的arr是主函数的变量 //调用快排函数,因为快排函数涉及到分治,把数据分成左右两部分,还继续调用 QuaiPai(arr,0,arr.length-1); // 调用快排后,直接输出 System.out.println(Arrays.toString(arr)); } //快排需要左和右的游标,每轮都会把数据分成两部分,左部分右部分每轮数值都不一样 //这里传入的 arr是QuaiPai中的变量,但是两个的地址相同,操作都是一个数据,这里操作后不需要返回 public static void QuaiPai(int[] arr,int left,int right) { //限定函数的退出,对于函数就是return,对于循环就是break if(left>=right){ return; } //记录的left0是基值的位置意思 int left0=left; //设定基数值,每轮分段后每次以左边的值做为基值,每轮基值就不同了 int baseNumber = arr[left0]; //然后再进行比较 while (left != right) { //右边的元素比基值,加右游标,右边的游标是--,再++就超出数组的界限 System.out.println(right); while(arr[right]>=baseNumber && left<right){ right--; } System.out.println("--------------"); System.out.println(left); //左边的元素比基值,加左游标 while(arr[left]<=baseNumber && left<right){ left++; } //以上两个条件退出,证明有一个数left游标的值>baseNumber或者右边的元素<=baseNumber int tmp=arr[right]; arr[right]=arr[left]; arr[left]=tmp; } //退出游标left和 right的指示时,再把左游标和基值的位置交换,这样基值左边元素都比基值小,基值右边元素都比基值大 int tmp=arr[left0]; arr[left0]=arr[left]; arr[left]=tmp; //执行到这里,数组被基值分成左右两部分,左边比基值小,但无序,右边比基值大,也无序 //再次递归调用快排左边和右边 //现在数组分裂点在left的位置,left+1到数组结尾是右边,右边使用快排 QuaiPai(arr,left+1,arr.length-1); //从left0开始,到right-1 QuaiPai(arr,left0,right-1); } }