快速排序
快速排序是先给一个数归位
- 找一个基准值(比基准值大的在右边,比基准值小的放左遍),一般选择左边第一个元素作为基准值,两个索引分别指向两端的数。
- 第一次循环索引从后往前比较,如果比基准值小则交换位置,如果没有继续比较下一个,直到找到比基准值小的值才交换。
- 当找到一个比基准值小的值交换了位置之后,索引又从前往后开始比较,比基准值大的交换位置。
- 如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。
- 反复比较。指向基准值的索引一直不动。
- 直到从前往后的索引>从后往前比较的索引,结束第一次循环,此时对于基准值来说就已经归位了,左边(无序)的都比它小,右边(无序)的都比它大。
- 然后递归调用。
模拟图
// 第一次36<88,不交换位置
{36, 2, 12, 100, 98, 23, 54, 13, 77, 88}
↑ ↑
// 第二次36<77,不交换位置
{36, 2, 12, 100, 98, 23, 54, 13, 77, 88};
↑ ↑
// 第三次36>13,交换位置
{13, 2, 12, 100, 98, 23, 54, 36, 77, 88};
↑ ↑
// 第四次2<31,不交换位置
{13, 2, 12, 100, 98, 23, 54, 31, 77, 88};
↑ ↑
// 第五次12<31,不交换位置
{13, 2, 12, 100, 98, 23, 54, 31, 77, 88};
↑ ↑
// 第六次100>31,交换位置
{13, 2, 12, 31, 98, 23, 54, 100, 77, 88};
↑ ↑
// 第七次31<54,不交换位置
{13, 2, 12, 31, 98, 23, 54, 100, 77, 88};
↑ ↑
// 第八次31>23,交换位置
{13, 2, 12, 23, 98, 31, 54, 100, 77, 88};
↑ ↑
// 第九次98>23,交换位置
{13, 2, 12, 23, 31, 98, 54, 100, 77, 88};
↑ ↑
代码
package com.common;
import java.util.Arrays;
/**
* 快速排序
* @date : 2020-12-03 08:47
**/
public class AppTest {
public static void quickSort(int[]a,int start,int end) {
int t;
int left = start;//0
int right = end; //9
while (left < right ) {
//基准值小,右边下标左移
while (a[left] < a[right]) {
right--;
}
//
if (left < right) {
t = a[left];
a[left] = a[right];
a[right] = t;
left++;
}
while (a[left] < a[right] && left < right) {
left++;
}
if (left < right) {
t = a[left];
a[left] = a[right];
a[right] = t;
right--;
}
}
//左
if (left>start){
quickSort(a, start, left-1);
}
//右
if (left<end){
quickSort(a, left+1, end);
}
}
public static void main(String[] args) {
int[] a = {36, 2, 12, 100, 98, 23, 54, 13, 77, 88};
System.out.println(Arrays.toString(a));
quickSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}
溜了溜了!!!