1.基本原理
首先定义一个变量将数组第二个数存入。用这个数与数组之前的数进行比较,如果该数大于之前的数,则直接结束,若该数小于之前的数,则让其与前一个数进行交换,循环直到该数大于其前一个位置上的数为止。适合用在数组已经基本有序的情况下。
2.代码实现
public static void quick(int[] arr,int lef,int rig)
{ //快速排序 0(nlogn)
if(lef>rig) //如果左边下标大于右边下标,说明出错直接返回结束
{
return;
}
int i=lef; //i指向最左边
int j=rig; //j指向最右边
int base=arr[lef]; //变量base保存基准数
while (i!=j) //当左右指针不指向相同位置时
{
while (arr[j] >= base && i<j) //从右向左搜索比左边第一个基准数小的,直到找到第一个比基准数小的
{
j--;
}
while (arr[i] <= base && i<j) //然后从左边开始往右搜索大于基准数的
{
i++;
}
int temp=arr[i]; //然后交换大于基准数和小于基准数的
arr[i]=arr[j];
arr[j]=temp;
} //如果循环结束,说明i的右边没有小于基准数的数
arr[lef]=arr[i]; //把这个相遇位置的元速赋给left作为下一轮的基准数
arr[i]=base; //然后把基准数赋给相遇的位置
//然后第一遍结束,i和j相遇的位置,左边的数都比它小,右边的数都比它大
quick(arr,0,i-1); //然后递归相遇位置左边的部分,直到lef>rig
quick(arr,j+1,rig); //然后递归右边的部分,也是直到lef>rig
}