快速排序的思想:
1.从数列中选取一个元素称为“基准值”(最基本的快速排序选取待排序数组的第一个数字作为基准值)。
2.对数列进行排序,将比基准值小的数放在基准前面,比基准值大的数放在基准后面(相同的数可以放在任意一边);也就是将数组分为了两个区间。
3.递归地把小于基准的子序列和大于基准的子序列进行排序。
快排时间复杂度:O(nlogn)
最坏情况:O(n^2)
空间复杂度:O(logn)
稳定性:不稳定
快速排序递归代码实现:
public static void quickSort(int arr[],int low,int high){
int i,j,tmp;
if (low>high){
return;
}
i=low;
j=high;
tmp=arr[low];
while(i<j){
//判断后面元素是否大于基准,如果小于就跳出
while (arr[j]>=tmp && i<j){
j--;
}
while(arr[i]<=tmp && i<j){
i++;
}
if(i<j) {
int t=arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[low]=arr[i];
arr[i]=tmp;
quickSort(arr,low,j-1);
quickSort(arr,j+1,high);
}
快速排序非递归代码实现:
public static void quickSort(int[] array) {
int[] stack = new int[array.length / 2];
int top = 0;
int low = 0;
int high = array.length - 1;
//先进行一次快速排序
int par = partion(array, low, high);
//1.判断当前par得左右两边是否有两个数据以上
if (par > low + 1) {
stack[top++] = low;
stack[top++] = par - 1;
}
if (par < high - 1) {
stack[top++] = par + 1;
stack[top++] = high;
}
//以上代码执行完毕,两边的树对已经全部入栈
//需要做的工作就是判断栈是否为空,不为空,取出对应的两个数对
//进行partion();
while (top > 0) {
high = stack[--top];
low = stack[--top];
par = partion(array, low, high);
//1.判断当前par得左右两边是否有两个数据以上
if (par > low + 1) {
stack[top++] = low;
stack[top++] = par - 1;
}
if (par < high - 1) {
stack[top++] = par + 1;
stack[top++] = high;
}
}
}
//进行一次快速排序
public static int partion(int[] array, int low, int high) {
int temp = array[low];
while (low < high) {
while ((low < high) && temp <= array[high]) {
high--;
}
if (low >= high) {
break;
} else {
array[low] = array[high];
}
while ((low < high) && array[low] <= temp) {
low++;
}
if (low == high) {
break;
} else {
array[high] = array[low];
}
}
array[low] = temp;
return low;
}