版权声明:版权归JansonLin所有,转载请标明出处。 https://blog.csdn.net/Janson_Lin/article/details/84071609
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
举例:
待排序数组: 2 4 6 3 1 5
第一次排序: 2 4 6 3 1 5 ---> 2为基准值 向右比较
第一次交换后 :1 4 6 3 2 5 2>1 与1交换位置 开始向左比较
第二次交换后 :1 2 6 3 4 5 4>2 与4交换位置 开始向右比较 右边无比2小的数,结束第一次排序
第二次排序:1 2 6 3 4 5 以2为界,前后拆开为两个数组,在进行第一次排序的形式进行排序。
1 与 6 3 4 5 两个数组
代码
public class QuickSort {
/**
* 将数组的某一段元素进行划分,小的在左边,大的在右边
* @param a
* @param start
* @param end
* @return
*/
public static int partition(int[] a, int start, int end){
//每次都以最右边的元素作为基准值
int base = a[end];
//start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
while(start < end){
while(start < end && a[start] <= base)
//从左边开始遍历,如果比基准值小,就继续向右走
start++;
//上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
if(start < end){
//交换
int temp = a[start];
a[start] = a[end];
a[end] = temp;
//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位
end--;
}
while(start < end && a[end] >= base)
//从右边开始遍历,如果比基准值大,就继续向左走
end--;
//上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
if(start < end){
//交换
int temp = a[start];
a[start] = a[end];
a[end] = temp;
//交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
start++;
}
}
//这里返回start或者end皆可,此时的start和end都为基准值所在的位置
return end;
}
/**
* 排序--递归
* @param a
* @param start
* @param end
*/
public static void sort(int[] a, int start, int end){
if(start > end){
//如果只有一个元素,就不用再排下去了
return;
}
else{
//如果不止一个元素,继续划分两边递归排序下去
int partition = partition(a, start, end);
sort(a, start, partition-1);
sort(a, partition+1, end);
}
}
public static void main(String[] args) {
int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
sort(a, 0, a.length-1);
System.out.println("排序后的结果:");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}