欢迎大家关注我的微信公众号:
上一篇我们聊了聊插入排序、希尔排序和冒泡排序。
今天我们重点讲一讲快速排序。
快速排序的思路:
1、基准数:根据基准数分成左右2组,左边的都比基准数小,右边的都比基准数大。
2、分组以后,分别对组内进行排序。
假设有这样一组数据,
45 28 80 90 50 16 100 10
同学们先思考,如何通过快速排序进行排序呢?
好,我们一起来理一理快排的过程:
一、选基准数45(基准数可以是任意一个,一般选第一个)
从序列后面往前找,找到比基准数小的进行交换;
10 28 80 90 50 16 100 45
从序列前面往后找,找到比基准数大的进行交换。
10 28 45 90 50 16 100 80
重复上面的操作:
从序列后面往前找,找到比基准数小的进行交换;
10 28 16 90 50 45 100 80
从序列前面往后找,找到比基准数大的进行交换。
10 28 16 45 50 90 100 80
直到前后查找的数值重复,结束第一次排序。
二、此时序列按基准数分成了3组:
{10 28 16} 45 {50 90 100 80}
这样一看,是不是左边都小于基准数,右边都大于基准数。
然后分别对左右两组序列进行快速排序,
左边以10为基准数,右边以50为基准数,
重复上面的排序过程。
最终完成整个序列的排序,这就是快速排序。
原理搞懂了,那如何用代码实现呢?
话不多说,直接上代码,
但是同学们一定要先自己思考,培养自己算法思维。
package com.monkey.springdemo.utils.sort;
/**
* 快速排序
*/
public class QuickSort {
public static void qSort(int data[], int left, int right){
int ll = left; //从左边找的位置
int rr = right; //从右边找的位置
int base = data[left]; //取第一个数为基准数
while (ll < rr){
//从后往前找,找到比基准数小的进行对换
while (ll < rr && data[rr] >= base){
rr--;
}
if(ll < rr){ //防止没有找到,导致数据交换
data[ll] = data[ll] + data[rr];
data[rr] = data[ll] - data[rr];
data[ll] = data[ll] - data[rr];
ll++; //找过的不需要再重复找一遍
}
//从前往后找,找到比基准数大的进行对换
while (ll < rr && data[ll] <= base){
ll++;
}
if(ll < rr){
data[ll] = data[ll] + data[rr];
data[rr] = data[ll] - data[rr];
data[ll] = data[ll] - data[rr];
rr--;
}
}
//以基准数分为3部分,左边比基准数小,右边比基准数大,分别对左右进行快速排序
if(ll > left){
qSort(data,left,ll-1);
}
if(rr < right){
qSort(data,ll+1,right);
}
}
public static void main(String[] args) {
int data[] = {45,28,80,90,50,16,100,10};
qSort(data,0,data.length-1);
for (int i = 0; i < data.length; i++){
System.out.print(data[i] + " ");
}
}
}
如果大家对基准数左右排序那里不理解,
可以debug去跟一跟,一定要试一试,
这样对算法的理解才能更进一步。