一:主要思想
快速排序是冒泡程序的改进(冒泡排序中,比较和移动元素的个数是在相邻元素中进行的,元素比较移动的次数相对较多)
快速排序是元素有两端向中间移动,元素较小的从后面移动到前面,元素较大的从前面移动到后面,从而减少移动的次数)
二:问题
1:如何选择中心轴值
2:如何进行一次性划分
3:如何处理划分好的子序列
4:快速排序结束的标志
三:问题的解决方案:
1:中心轴值我们一般选取待排序第一个元素
2:两个下标i,j,进行右扫描和左扫描,知道i<j为止
3:分区只剩下一个记录为止
四:程序原代码
package com.ccut.quickSort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] array = { 0, 4, 54, 6, 8, 9, 4, 9, 12, 32 };
QuickSort(array, 0, array.length - 1);
System.out.print(Arrays.toString(array));
}
/**
* 快速排序
*/
private static void QuickSort(int[] array, int first, int end) {
if (first < end) {
int i=Partition(array,first,end);
QuickSort(array, first,i-1);
QuickSort(array,i+1,end);
}
}
/**
* 进行一次性快排
*/
private static int Partition(int arr[], int first, int end) {
while (first < end) {
// 进行左扫描
while (first < end && arr[first] <= arr[end]) {
end--;
}
if(first<end)
{
int temp = arr[first];
arr[first] = arr[end];
arr[end] = temp;
}
// 进行右扫描
while(first < end && arr[first]<= arr[end]) {
first++;
}
if(first<end)
{
int temp = arr[first];
arr[first] = arr[end];
arr[end] = temp;
}
}
return first;
}
}
五:时间复杂度:
最好(O(nlog2n))
最换(正序或者逆序) O(n2)