个人理解快速排序的原理,定义两个标量,一个数的值是数组的第一位下标值(上标量)值为0,另一个是数组最后一位下标值(下标量)值为数组长度减1
首先从数组中选取的下标值为上标量的数,从数组最后一位开始向前比较,遇到第一个比选取值大的数,就交换位置,根据判断标识来判定是 上标量加一,还是下标量减一,
这时候就从数组选取下标值为下标量的数,从数组的下标为上标量的数进行比较,需要进行第一次交换,就交换位置,还是根据判断标识来判定是 上标量加一,还是下标量减
一,直到上标量和下标量的值相等,完成第一趟快速排序,这是数组就变成比最开始从数组选中的下标为上标量的值0小的数在它的前面,反之则在它的后面,分别对这两组进行快速排序,直到最后完成排序结束。
package change.sort;
public class QuickSort {
public static void main(String[] args) {
//声明数组
int[] nums = {27,8,57,9,23,41,65,19,0,1,2,4,5};
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
System.out.println();
//应用快速排序方法
quickSort(nums,0,nums.length-1);
//显示排序后的数组
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
private static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0; //上标
int hi = hi0; //下标
if(lo>hi){
return;
}
//确定指针方向的逻辑变量
boolean transfer = true;
while(lo!=hi){
if(a[lo]>a[hi]){
//交换数字
int temp = a[lo];
a[lo]=a[hi];
a[hi]=temp;
//决定下标移动,还是上标移动
transfer=(transfer==true)?false:true;
}
if(transfer){
hi--;
}else{
lo++;
}
//显示每一次指针移动的数组数字的变化
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+",");
}
System.out.print("(lo,hi)="+"("+lo+","+hi+")");
System.out.println("");
}
//将数组分开两半,确定每个数字的正确位置
lo--;
hi++;
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
}
运行结果:
27 8 57 9 23 41 65 19 0 1 2 4 5
5,8,57,9,23,41,65,19,0,1,2,4,27,(lo,hi)=(1,12)
5,8,57,9,23,41,65,19,0,1,2,4,27,(lo,hi)=(2,12)
5,8,27,9,23,41,65,19,0,1,2,4,57,(lo,hi)=(2,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(3,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(4,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(5,11)
5,8,4,9,23,27,65,19,0,1,2,41,57,(lo,hi)=(5,10)
5,8,4,9,23,2,65,19,0,1,27,41,57,(lo,hi)=(6,10)
5,8,4,9,23,2,27,19,0,1,65,41,57,(lo,hi)=(6,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(7,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(8,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(9,9)
0,8,4,9,23,2,1,19,5,27,65,41,57,(lo,hi)=(1,8)
0,5,4,9,23,2,1,19,8,27,65,41,57,(lo,hi)=(1,7)
0,5,4,9,23,2,1,19,8,27,65,41,57,(lo,hi)=(1,6)
0,1,4,9,23,2,5,19,8,27,65,41,57,(lo,hi)=(2,6)
0,1,4,9,23,2,5,19,8,27,65,41,57,(lo,hi)=(3,6)
0,1,4,5,23,2,9,19,8,27,65,41,57,(lo,hi)=(3,5)
0,1,4,2,23,5,9,19,8,27,65,41,57,(lo,hi)=(4,5)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(4,4)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,2)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,1)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,0)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(1,2)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(1,1)
0,1,2,4,5,23,9,19,8,27,65,41,57,(lo,hi)=(3,3)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(6,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(7,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(8,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(5,6)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(5,5)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(6,6)
0,1,2,4,5,8,9,19,23,27,57,41,65,(lo,hi)=(11,12)
0,1,2,4,5,8,9,19,23,27,57,41,65,(lo,hi)=(12,12)
0,1,2,4,5,8,9,19,23,27,41,57,65,(lo,hi)=(11,11)
0 1 2 4 5 8 9 19 23 27 41 57 65