快速排序的思想总结:设定pivot,通过左右双指针与pivot进行比较,若发现左边大于pivot,右边小于pivot,则进行左右数字位置对调,最终最终保证数组靠左侧数值都小于povit,数组靠右侧数值都大于pivot。
设定头部数字8位pivot(可自由设定);
(图解如下)
编码:
public class QuickSort {
public static void main(String[] args) {
int[] array = new int[1000];
for(int i = 0; i < array.length; i++){
array[i] = (int)(Math.random() * 10000);
}
quickSort(array);
for (int j = 0; j < array.length; j++){
System.out.println(array[j]);
}
}
public static void quickSort(int[] array){
sort(array, 0, array.length -1);
}
public static void sort(int[] array, int start, int end){
//这里需要注意,没有这个条件会进入死循环
if (start >= end){
return;
}
int pivot = array[start];
int left = start;
int right = end;
while (left <= right){
while (left <= right && array[left] < pivot){
left++;
}
while(left <= right && array[right] > pivot){
right--;
}
if(left <= right){
int temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
}
//每一轮排序结束时right < left
sort(array, start, right);
sort(array,left, end);
}
}
- 时间复杂度:O(nlogn)
- 空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
- 稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
网友评论