思想是分治法。将数组分成2个子序列,然后独立的进行排序,和归并排序是互补的。
详细描述:首先在要排序的序列 a 中选取一个基准值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于基准值,右边的部分 c 的元素 均大于或者等于基准值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。
快速排序在进行交换时,只是根据比较基数值判断是否交换,且不是相邻元素来交换,在交换过程中可能改变相同元素的顺序,因此是一种不稳定的排序算法。快速排序方法在要排序的数据已经有序的情况下最不利于发挥其长处。
复杂度:
当基数值不能很好地分割数组,即基准值将数组分成一个子数组中有一个记录,而另一个子组组有 n -1 个记录时,下一次的子数组只比原来数组小 1,这是快速排序的最差的情况。如果这种情况发生在每次划分过程中,那么快速排序就退化成了冒泡排序,其时间复杂度为O(n2)。
如果基准值都能讲数组分成相等的两部分,则出现快速排序的最佳情况。在这种情况下,我们还要对每个大小约为 n/2 的两个子数组进行排序。在一个大小为 n 的记录中确定一个记录的位置所需要的时间为O(n)。
快速排序的平均时间复杂性为O(nlogn)。
java实现:
public class fastSortTest {
static void quick_sort(int s[], int l, int r)
{
if (l < r)
{
int i = l, j = r, x = s[l]; //x是基准
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用,排左侧的部分
quick_sort(s, i + 1, r); // 递归调用 ,排右侧的部分
}
}
public static void main(String [] args) {
int [] array={1,3,2,2,5,4};
quick_sort(array,0,array.length-1);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+"\t");
}
}
}