快速排序
简介
快速排序(Quicksort)是对冒泡排序算法的一种改进。原理是设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选
用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
时间复杂度
平均时间复杂度:O(nlog2n),最坏时间复杂度:O(n²)
代码
public static void quickSort(int[] arr,int left, int right) {
int l = left;
int r = right;
int pivot = arr[(left + right) / 2];
int temp;
while (l < r) {
while (arr[l] < pivot) {
l += 1;
}
while (arr[r] > pivot) {
r -= 1;
}
if (l >= r) {
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//这样与中间那个数相等的数就不断往中间移动
if (arr[l] == pivot) {
r -= 1;
}
if (arr[r] == pivot) {
l += 1;
}
}
// 如果 l == r, 必须l++, r--, 否则会出现栈溢出
if (l == r) {
l += 1;
r -= 1;
}
//向左递归
if (left < r) {
quickSort(arr,left,r);
}
//向右递归
if (right > l) {
quickSort(arr,l,right);
}
}
测试
int[] arr = {1,8,6,5,2,3,7};
quickSort(arr,0,arr.length - 1);
System.out.println(Arrays.toString(arr));