快速排序的特点
快速排序是交换排序的一种,实质上是对冒泡排序的一种改进。使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
稳定性:不稳定
时间复杂度Ο(n log n)
空间利用率:递归导致栈空间的使用,最好空间复杂度为Ο(log n),最差空间复杂度Ο(n)
快速排序的思想
在n个记录中取某一个记录的键值为标准,通常取第一个记录键值为基准,通过一趟排序将待排的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分记录的键值小,然后,对这两部分记录继续分别进行快速排序,以达到这个记录的有序。
快速排序的代码
// 快速排序
@Test
public void quick(){
int[] a = new int[]{3,1,4,6,5,9,7,2,8,0};
int[] array = quickSort(a,0,a.length-1);
for (Integer yuansu:array){
System.out.println(yuansu);
}
}
public int[] quickSort(int[] array, int left, int right)
{
int low = left;
int high = right;
int temp = 0;
if (low <= right)
{
temp = array[low]; //待排序的第一个元素作为基准元素
while (low != high) //从左右两边交替扫描,直到left = right
{
while (array[high] >= temp && high > low)
{ //从后向前搜索比key小的值
high--;
}
array[low] = array[high]; //比key小的放左边
while (array[low] <= temp && high > low)
{ //从前向后搜索比key大的值,比key大的放右边
low++;
}
array[high] = array[low]; //比key大的放右边
}
array[high] = temp; //基准元素归位
quickSort(array, left, high - 1); //对基准元素左边的元素进行递归排序
quickSort(array, high + 1, right); //对基准元素右边的进行递归排序
}
return array;
}