- 快速排序
下面说下我对于快速排序的理解,首先它是排序算法中一种,既然是排序那么自然少不了最基本的 比较、交换、循环,
快速排序可以称其为单轴快排,这个轴就是你选中的一个基准,在一串需要排序的数字中选择一个轴,然后将其余全部的数字与这个选中的轴进行比较,比这个轴小的放在左边,比这个轴大的放在右边,此时就相当于将数组分成了两个部分,然后在各个部分重复上面的操作,即可完成快速排序。
废话不多说,直接上代码
对于轴的选择,我们每次都选择需要进行排序数组的最后一个数为轴,然后将剩下的所有数与其进行比较,根据其原理会用到迭代
leftbound 为需要进行排序数组的左边界(下标)
rightbound 为需要进行排序的数组的右边界(下标) array.length() -1
public static int partition(int[] array,int leftbound,int rightbound) {
//中间的轴
int pivort = array[rightbound];
//左指针
int left = leftbound;
//右指针
int right = rightbound-1;
System.out.println("========="+right);
//此处 <= 当只剩下两个数比较时,如果左边的数大于右边的数,那么如果条件为left<right 则不会进行循环,那么两个数不会进行交换,则出现bug
while(left <= right) {
//从左边界开始,进行遍历
while(left <= right && array[left] <= pivort) {left++;}
//System.out.println("========="+right);
//从右边界开始,进行遍历
while(left <= right && array[right] > pivort) {right--;}
//System.out.println("========="+right);
System.out.println("交换左边下标"+left+"交换右边下标"+right);
//当左指针遇见比轴大的数时,跳出循环(内部左while),右指针遇见比轴小的数时,跳出循环(内部右while)将两数进行交换,继续遍历
if(left < right) swap(array,left,right);
}
//一次循环遍历完成之后,将此左指针指向的数与最后一个数(轴)进行交换
swap(array,left,rightbound);
//int mid = left;
//System.out.println("========="+mid);
//print(array);
//返回左指针,此时左指针的位置将数组分成了两个部分,为下次再次进行循环遍历提供了左边界和右边界
return left;
}
举个例子,现在有一个班的学生需要站队高低个,那么每次选择最后一个同学的身高为基准,然后有两个老师一个从第一个开始往后面数,直到碰见比最后一个同学高的或者遇见第二个老师停下来;另外一个从倒数第二个往前面数,直到碰见比最后一个矮的或者碰见第一个老师停下来;如果有身高不符合的就将两个同学交换,再继续往后面数,直到两个老师遇见 则停下来,将第一个老师指的同学与后面最后一个同学进行交换,每个分组都这样完成。