快速排序的算法是:
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
代码如下:
public class Quicksort {
public static void main(String[] args) {
int[] arr = new int[]{5,3,6,2,8,7,9};
int start = 0;
int end = 6;
Quicksort.quickSort(arr, start, end);
for(Integer i : arr) {
System.out.print(i+" ");
}
}
private static void quickSort(int[] s, int start, int end) {
if (start < end) {
int i = start;
int j = end;
int x = s[start];
while (i < j) { // 当比到 i 和 j 重合的时候,就停止比较
while (i < j && x < s[j]) { // 从右往左找一个比首位数小的数
j--; // 从右边往左边找时,如果没找到比首位数小的数,就会一直比
}
if (i < j) {
s[i] = s[j]; // 找到比第一个小的数后,进行交换,把小的数赋值给第一个数
i++; // 在交换后,把下标往右移一位,不然需要多比一次
}
while (i < j && s[i] < x) { // 从左往右找一个比交换后的数(首位数)大的数
i++; // 从左边往右边找时,如果没找到比交换后的数(首位数)大的数,就会一直比
}
if (i < j) {
s[j] = s[i]; // 找到比交换后的数(首位数)大的数后,进行交换,把大的数进行赋值
j--; // 在交换后,把下标往左移一位,不然需要多比一次
}
}
/*
* 当比到 i 和 j 重合的时候,就停止比较,把交换后的数(首位数)赋值给当前下标为 i 的数组
* 此时,就得到了一个中位数,该中位数左边的数都小于它,该中位数右边的数都大于它。
* */
s[i] = x;
quickSort(s, start, i-1); // 把中位数左边的数,以同样的方式进行,也就是递归
quickSort(s, i+1, end); // 把中位数右边的数,进行递归即可
}
}
}
排序演示
假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。
此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。
此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。
此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。