快速排序(Quick Sort),是一种效率很高的排序算法,是对冒泡排序的一种改进,它的基本思想是在数组中选择一个数作为pivot(排序中心),将数组元素分成比pivot小的和比pivot大的两部分,一部分是比pivot小的数组元素(全部移到数组左侧),另一部分是pivot大的数组元素(全部移到数组右侧,保证左边部分的数组元素比右边部分的数组元素小),然后再按此方法对两部分数组分别进行同样的快速排序算法,此过程可以用到递归进行处理。
下面我们举一个例子来展示快速排序的操作过程:
对于给定数组int s[ ]:3 2 5 1 4 2 9 7
快排算法:
(1)我们选取s[1]作为pivot,同时我们要设置两个指针,指向数组头和数组尾
(2)我们需要让right指针先移动,如果right指针指向的元素大于pivot,则right指针向左移动,直到right指针指向的元素小于pivot为止;当right指针移动完之后,我们需要让left指针进行移动,如果left指针指向的元素小于等于pivot,则left指针向左移动,直到left指针指向的元素大于pivot为止;然后交换s[right]和s[left],然后重复上述操作,直到left指针与right指针相遇
(3)left指针与right指针相遇后,将pivot与left和right共同指向的元素互换
(4)然后将数组分成两部分,left指针和right指针共同指向的元素左边的数组元素作为一个部分(不包括指向元素),left指针和right指针共同指向的元素右边的数组元素作为一个部分(不包括指向元素),将这两部分分别作为两个新数组,分别继续执行上述操作,这样递归下去,直到子数组中只剩一个元素为止
代码(java实现):
//快排算法
public static void sort(int[]args){
quickSort(args,0,args.length-1);
}
private static void quickSort(int[]args,int start,int end){
if(start>=end)
return;
int pivot=args[start];
int left=start;
int right=end;
while(left<right){
while(args[right]>pivot&&left<right)
right--;
while(args[left]<=pivot&&left<right)
left++;
change(args,right,left);
}
change(args,start,left);
quickSort(args,start,left-1);
quickSort(args,left+1,end);
}
private static void change(int[]args,int x,int y){
int temp=args[x];
args[x]=args[y];
args[y]=temp;
}
快排的时间复杂度:O(Nlog(N))(平均),O(N^2)(最坏)
快排的空间复杂度:O(log(N))(平均),O(N)(最坏)