快速排序
快速排序是一种改进版的冒泡排序。针对一组数据,按从小到大排序为例。首先随机选取一个数为基准(一般选取第一个数或者中间数)然后将数据分成左右两组,左边的每个数据都比基准小,右边的每个数据都比基准大。其实现思路是:
- 首先确定基准,然后确定左指针和右指针;
- 右指针先往左移动,找出比基准小的数的下标;
- 当右指针找到比基准小的数时,左指针开始向右移动,找到比基准打的数的下标;
- 如果左指针和右指针没有重合,就将各自找到的数进行交换位置;
- 重复2-4步,直到左右指针重合,一趟排序结束;
- 从指针位置分别进行左递归和右递归操作,直至排序完成。
快速排序的平均时间复杂度为O(nlogn),最差时间复杂度为O(n^2)。
我分别试了一下以第一个数、中间数和最后一个数为基准的方式,如有错误,还望指出,我会及时改正。代码如下:
package com.sort.quickSort;
import java.util.Arrays;
public class QuickSortDemo2 {
public static void main(String[] args) {
int[] array = new int[10];
// 随机生成10个0~100至今的数
int count = 0;// 记录有效的随机数个数
boolean flag = true;// 用来标志的变量
int num = 0;
while (count < array.length) {
num = (int) (Math.random() * 100);
for (int i = 0; i < array.length; i++) {
if (num == array[i]) {
flag = false;
break;
}
}
if (flag) {
array[count] = num;
count++;
} else {
flag = true;
}
}
System.out.println("排序前的数组:" + Arrays.toString(array));
quickSort(array, 0, array.length - 1);
}
// 快速排序
static int count = 0;
public static void quickSort(int[] array, int begin, int end) {
if (begin > end) {
return;
}
// 1.将头尾暂存
int left = begin;
int right = end;
// 2.选择基准
int temp = array[begin];// 以第一个数为基准
// int temp=array[(begin+end)/2];//以中间数为基准
// int temp=array[end];//以最后一个数为基准
while (left != right) {
// 先让右指针往前移,每次要保证right>left
// array[right]>temp:每次往前移动的时候,要么找到比基准小的数,要么找到基准的位置
while (left < right && array[right] > temp) {
right--;
}
// 再让左指针往后移,每次要保证right>left
// array[left]<temp:每次往后移动的时候,要么找到比基准大的数,要么找到基准的位置
while (left < right && array[left] < temp) {
left++;
}
// 只要左右指针没有重合,就将两个指针找到的数互换位置
// 1.如果左指针找到的数比基准大,右指针找到的数比基准小,互换位置
// 2.如果左指针找到的是基准的位置,右指针找到的数比基准小,互换位置后,基准的最终位置只会在此或其之前了;
// 3.如果左指针找到的数比基准大,右指针找到的是基准的位置,互换位置,基准的最终位置只会在此或其之后了;
// 4.左右指针一旦重合,说明都找到了移动到了基准的位置,就不用了互换位置了
if (left != right) {
int i = array[right];
array[right] = array[left];
array[left] = i;
}
}
// left和right就重合,表示一趟排序结束
System.out.println("第" + (++count) + "趟排序后:" + Arrays.toString(array));
// 分别向左和向右递归
quickSort(array, begin, left - 1);
quickSort(array, right + 1, end);
}
}