快速排序
介绍: 快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快 排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可 见掌握快排的重要性。
快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十 大算法之一,是迄今为止所有内排序算法中速度最快的一种。冒泡排序的升 级版,交换排序的一种。快速排序的时间复杂度为O(nlog(n))。
排序思想:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准 值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后, 该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数 列排序。
- 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好 了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代 (iteration)中,它至少会把一个元素摆到它最后的位置去。
//快速排序
public static void fast(int[] arr ,int left,int right) {
if (left > right) {
return;
}
int l = left;
int r = right;
int base = arr[left];
while (l != r) {
//从左往右找
while(arr[l] < base && l < r) {
l++;
}
//从右往左找
while(arr[r] > base && l < r) {
r--;
}
if (arr[l] == arr[r] && l <r) {
l++;
}else {
int tem = arr[l];
arr[l] = arr[r];
arr[r] = tem;
}
}
fast(arr, left, l - 1);
fast(arr, r + 1, right);
}