算法 十大排序 快排(单边扫描法)
在学习快排之前首先要了解一个快排中的概念元主;
元主:
元主:我们可以通俗的理解为是一个被比较的数。
那么是怎么进行操作使得数组的每一个数与元主进行比较呢
比较之后得到了一个结果我们应该要如何进行处理呢?
现在我们默认元主的数组的第一项,而指针sp的初始位置是从第二项开始进行扫描的。
快排的这样处理的,把指针所在的位置对应的下标在数组中的数字与元主进行比较,那么比较的结果有小于等于和大于这三种结果。
我们要如何处理呢?我们发现在现有的条件下我们无法来处理我们比较出来的结果的。所以我们要做一个标识。
接下来,我们的指针从左至右依次进行扫描。
当sp指针所对应的数字比元主小时,sp向右移
当sp遇到的数字比元主大时,我们把sp对应的数字和bigger对应的数字进行交换,bigger向左边移动
然后在继续在进行比较结果为
这个时候bigger和sp交错了,而bigger和sp交错之后sp就可以停止移动了,
注意:在bigger和sp交错之后,bigger所对应的位置一定是最后一个小于元主的数(有一点迷惑的话自己可以多举几个例子看一下),在交错之后bigger所对应的数字和元主进行交换
在交换之后,bigger左边的数一定是比元主小的,右边的数一定是比元主大的,在这一次比较中我们就确定了5这个数的位置
而接下来,3 2 2 4这一部分和6 7 9这一部分同样可以进行递归求解。
如何进行递归呢?
首先我们到找到bigger这个位置
//参数是数组,起始位置和结尾位置,而返回的p是我们上面所求的bigger,
int p=potion(arr, len, end);//而确定一个p值就像前面所说的确定了一个数的位置
//得到p之后我们在递归确定下一个数字的位置
quickSort(arr, len, q-1 );//相当于前面的3 2 2 4这一部分
quickSort(arr, q+1, end);//相当于前面的6 7 9这一部分
具体代码:
public class _03_快排单向扫描 {
public static void main(String[] args) {
int arr[] = {5,2,9,7,6,3,4,2};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
public static void quickSort(int[] arr,int len,int end) {
if(len<end) {
int q=potion(arr, len, end);
quickSort(arr, len, q-1 );
quickSort(arr, q+1, end);
}
}
public static int potion(int[] arr,int len,int end) {
int sta = arr[len];
int sp=len+1;
int bigger=end;
while(sp<=bigger) {//右指针大于等于左指针
if(arr[sp]<=sta) {//左指针下标的数字是否比元组大
sp++;
}else {
awp(arr, sp, bigger);
bigger--;
}
}
//把元主移到右指针的下标的数子
awp(arr, len, bigger);
return bigger;
}
public static void awp(int[] arr,int le,int en) {
int temp=arr[le];
arr[le] = arr[en];
arr[en]=temp;
}
}