快速排序
快速排序
核心思想:
- 设定基数:基数可以从左或者从右边取,无序数列中任意取都可以
- 设定无序数列最左最右,L,R
- R往左找,基数>B,L往右,找A>基数,尝试,找到A>基数>B这种格式
- if 找到,交换AB
- 无论如何,继续左右偏移,直到L==R(意味着左边没有大于基数,右边没有小于基数),就算基数应所处位置
- 把基数替换到该位置
- 数列逐步有序,将基数左右序列重复以上步骤;
例:
子序列 (2,1)基数2,L=2,R=1;
R<基数,R不偏移,L偏移
RL,LR==1,与基数进行交换
下标为0,1,还含有区间
分成子序列
(0,L-1R-1)(L-1R-1,1)
(0,1-1)(1+1,1)
(0,0)(2,1)
if(L>=R)return;
没有区间了,进行返回
package Sort;
import java.util.Arrays;
// 快速排序
public class QuickSort {
static int[]arry={60,9,2,8,7,3,6,4,5,11,20,9};
public static void main(String[] args) {
int l,r,m;
m=l=0;
r=arry.length-1;
quick(l,r);
}
// 快排函数
public static void quick(int l,int r)
{
int right=r;
int left=l;
int temp=l;
// 左右已经没有区间了,小于是为了防止AB相邻的时候,左右同时减去
if (r<=l)
{
return;
}
//
while (r!=l)
{
// 先右边靠左移动,找到比基数要小的数
if (arry[temp]>arry[r])
{
// 找到后再从左边找比基数要大的数
if (arry[temp]<arry[l])
{
// 两个数都找到了,A>基数>B
// 交换AB
int num=arry[r];
arry[r]=arry[l];
arry[l]=num;
}
else
{
// 左右标的移动
l++;
}
}
else
{
r--;
}
}
// 如果左边没有比它大的,右边没有比它小,说明什么?
// 123123123 5 9876,假设5是基数,是不是就可以找到5应该所在的位置?
// 虽然左右序列都是无序,但是却找到基数应该所处的位置
// 且由于循环交换A>基数>B,数列逐渐有序
int num=arry[temp];
arry[temp]=arry[l];
arry[l]=num;
System.out.println(Arrays.toString(arry));
// 递归
// ****************************************
// 注意要给l-1和+1,这个雷我踩了一个下午才发现
// 因为l所在的位置,已经是有序的,不需要进行排列
// l已经在它所应该在的位置
// ****************************************
quick(left,l-1);
quick(l+1,right);
}
}