快速排序
快速排序的基本思想:
1.选一个数作为基准数(一般选取区间的第1个数)
2.把所有比这个大的数放到右边,所有比这个数小的数放到左边
3.以基准数为分界线,分为左右两个区间,重复1和2过程,直到区间的个数只有一个
下面我们就用实例来说明:
我们需要有三个参数,i是区间的开始,j是区间的结束,temp是基准数
第一步:i=0,j=7,temp=12
第二步:j往前找,找到第一个比temp小的数就停下来,并且和i的值进行交换
在这里找到比temp小的第一个数就是a[ 5],此时i=0,j=5,temp=12
进行交换
第三步:i往后找,找到第一个比temp大的数就停下来,并且和j的值进行交换
在这里找到比temp大的第一个数就是a[ 3],此时i=3,j=5,temp=12
进行交换
第四步:j继续往前找,一直找到i=j都没有找到比temp小的数,则停止寻找,第一轮比较结束。此时,所有比temp小的数都在左边,比temp大的数都在右边了。此时,i=j=3,temp=12。
第五步:以3这个索引为分界线,分为[0,2]和[4,7]两个区间,并且一直重复上述步骤,直到子区间只有一个数,不能在分割,下面不再详细说步骤了。
下面就是快速排序的java代码:
public class FastAlgorithm {
public void sort(int[] arr,int start,int end) {
//标记第一个位置
int i = start;
//标记最后一个的位置
int j = end;
//标记基准数
int first = arr[start];
while(i<j) {
//j从右往左递减,和first作比较
while(j>i && arr[j]>first) {
j--;
}
//找到第一个比first小的,交换两个数
if(arr[j]<=first) {
swap(arr,i,j);
i++;
}
//从左往右递增,和first比较
while(i<j && arr[i]<first) {
i++;
}
//找到第一个比first大的,交换两个数
if(arr[i]>=first) {
swap(arr,i,j);
j--;
}
}
//i=j时,跳出循环
//递归
//如果左区间个数不小于一,则递归下去
if(i>start)
sort(arr,start,i-1);
//如果右区间个数不小于一,则递归下去
if(j<end)
sort(arr,j+1,end);
}
/**
* 交换数组中的两个元素
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr,int i,int j) {
int k;
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}