【每日算法】快速排序
今日题目:以中间数为基准,对某数列进行快速排序。
点题:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
-
1.先从数列中取出一个数作为基准数。 -
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 -
3.再对左右区间重复第二步,直到各区间只有一个数。 -
大家可以先自行思考,并自己使用算法实现
以下为具体程序(Java):
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
public class Quicksort {
public static void main(String[] args) {
int arr[]=new int[]{15,52,0,-3,222,36,-18,90,-5556,7};
System.out.println("排序前的数组是:"+Arrays.toString(arr));
System.out.println("***************");
Qs(arr,0,arr.length-1);
System.out.println("排序后的数组是:"+Arrays.toString(arr));
}
public static void Qs(int []arr,int left,int right){
int l=left; //左索引
int r=right; //右索引
int pivot=arr[(l+r)/2];
int temp=0; //临时变量
//while循环的目的是每一次都把比pivot小的放他左边,比pivot大的放他右边
while (l<r){
while (arr[l]<pivot){
l+=1;
}
while ((arr[r]>pivot)){
r-=1;
}
//如果是这样,说明pivot的左右两的值,已经按照左边全是小等于pivot、右边全是大等于pivot值
if(l>=r){
break;
}
//交换
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//如果交换完后,发现这个arr【l】==pivot值相等 r-- 前移一下
if(arr[l]==pivot){
r-=1;
}
//如果交换完后,发现这个arr【r】==pivot值相等 l++ 后移一下
if(arr[r]==pivot){
l+=1;
}
}
//如果l==r,必须l++ r-- 否则为出现栈溢出
if(l==r){
l+=1;
r-=1;
}
//向左递归
if (left<r) {
Qs(arr,left,r);
}
//向右递归
if(right>l){
Qs(arr,l,right);
}
}
}