快速排序 平均时间复杂度 O(NlogN) 最差时间复杂度O(N*N) 不稳定
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
/**
* 1.先从数列中取出一个数作为基准数。
* 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
* 3.再对左右区间重复第二步,直到各区间只有一个数。
* 时间复杂度为O(nlog n)
* 不稳定排序方式
*/
public class quickSort {
public static int[] sort(int[] data, int left, int right){
if (left < right) {
int mid = partition(data, left, right);
sort(data, left, mid - 1); //左边
sort(data, mid + 1, right); //右边
}
return data;///返回
}
public static int partition(int[] data, int left, int right) {
int x = data[left];//基准数
int i = left;
int j = right;
if (left < right) {
while (i < j) {
while ((i<j) && (data[j] >= x)) {
j--;
}
if (i < j){
data[i++] = data[j];
}
while ((i<j) && (data[i] < x)) { //从左边第一个小于x的数
i++;
}
if (i < j) {
data[j--] = data[i];
}
}
data[i] = x;
}
return i;
}
public static void main(String[] args) {
int[] data = {4, 7, -4, 13, 6, 6, 18, 10, 85, 94};
quickSort.sort(data, 0, data.length - 1);
}
}