快速排序:是冒泡排序的改进型。首先在数组中选取一个基准点,设置进行快排的数组段low~high。对于每一次快排,设置前后两个遍历指针start和end,分别初始化为排序数组的首位和末位。假设刚开始设置的基准点为数组中的第一个元素,先从后面遍历,end一次减小,如果找到一个比基准点小的数,就交换两者的位置。然后从前面遍历,start依次增大,如果找到一个比基准点大的值就交换两者的位置,直到前后遍历的位置相遇,即start=end,结束本轮排序。然后记录基准点当前所在位置,将原数组分成两部分分别进行递归,实现排序。
快速排序的最优时间复杂度为O(nlogn),对应的情况是每一次取到的元素都平分数组中的元素。快速排序的最差的时间复杂度为O(n^2),对应的情况是每次取到的元素是数组中的最大值或最小值。快速排序的平均时间复杂度为O(nlogn)。
快速排序的最优空间复杂度O(logn),对应于每一次都平分数组的情况,快速排序的最差空间复杂度为O(n),对应于退化为冒泡排序的情况。
代码实现:
class test
{
public static void main(String[] args)
{
int[] arr = {6,3,7,4,1};
quickSort(arr, 0, arr.length - 1);
for(int i = 0; i < arr.length; i++)
{
System.out.println(arr[i]);
}
}
public static void quickSort(int[] arr, int low, int high)
{
int start = low;
int end = high;
int point = arr[low];
while(start < end)
{
while(start < end && arr[end] >= point)
{
end--;
}
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
while(start < end && arr[start] <= point)
{
start++;
}
int temp1 = arr[end];
arr[end] = arr[start];
arr[start] = temp1;
}
if(start > low) quickSort(arr, low, start - 1);
if(end < high) quickSort(arr, end + 1, high);
}
}