快速排序的思路就是先定个锚点,我们可以选择前端的一个数或者后端的一个数作为锚点,然后从另一端开始匹配,将小于的数放在前面,大于的数放在后面。
比如说;给定一组数:30,40,60,10,20,50
- 需要两个指针i、j分别指向数组的头和尾
- 确定锚点x,令x=30
- 从后面往前遍历,并判断是否存在比锚点小的数,若有则返回它的索引值
- 判断i<j;true则将将该值赋给指针i指向的地址,并将指针i向后移动
- 移动指针i,直到查询到比锚点大的值,返回索引
- 判断i<j;true则将将该值赋给指针j指向的地址,并将指针j向前移动
- 慢慢遍历,直到指针i和指针j指向同一地址,则退出循环
- 在将锚点的值赋予两个指针指向的地址
- 将锚点前后的数分成两个数组,在分别进行递归操作,直到完成排序
代码如下:
package com.piao.sort;
/**
* 快速排序:
* 思路:先找一个基点,然后将其他数依次与之比较,小的放前面,大的放后面,然后利用分治的方法
*/
public class QuickSortTest {
public static void main(String[] args) {
int[] a={30,40,60,10,20,50};
System.out.println("before:");
for (int i : a) {
System.out.print(i+",");
}
System.out.println(" ");
System.out.println("after:");
quick_sort(a,0,a.length-1);
for (int i : a) {
System.out.print(i+",");
}
}
public static void quick_sort(int[] a ,int low,int high){
if (low<high){
int i,j,x;
x=a[low];
i=low;
j=high;
while (i<j){
while(i<j&&a[j]>x){
j--;
}
if (i<j){
a[i++]=a[j];
}
while(i<j&&a[i]<x){
i++;
}
if (i<j){
a[j--]=a[i];
}
}
a[i]=x;
quick_sort(a,low,i-1);
quick_sort(a,i+1,high);
}
}
}