快速排序
快速排序原理
Java代码
- 总结
快速排序原理
思想:(快速排序的思想很简单,只需一下几步就可以完成了)
1.首先设待排序数组起始点为low,结束点high,然后从待排序数组中选择一个基准点
2.将数组以基准点值为标准分为左右两部分,左边都比基准点值小,右边都比基准点值大
3.然后将左右两部分继续重复前1、2,直到low不小于high结束
以上三步完成以后,数组即从小到大排好了顺序
Java代码
package cn.com.mp.sort;
public class QuickSort {
public static void main(String[] args) {
// int[] array = { 56, 2, 8, 5, 9, 46, 53, 7, 1 };
int[] array = { 12, 56, 8, 6, 50, 45, 2, 13, 89, 21 };
int len = array.length;
sort(array, len);
/* 遍历排序后的数组,输出结果 */
for (int i = 0; i < len; i++) {
System.out.print(array[i] + " ");
}
}
/* 快速排序算法(统一接口) */
public static void sort(int[] array, int len) {
/* 正真的快速排序算法 */
quickSort(array, 0, len - 1);
}
/* 快排正真的算法 */
public static void quickSort(int[] array, int low, int high) {
if (low < high) {
/* 得到基准点 */
int middle = getMiddle(array, low, high);
/* 递归快排基准点左右两部分 */
quickSort(array, low, middle - 1);
quickSort(array, middle + 1, high);
}
}
/* 得到基准点 */
public static int getMiddle(int[] array, int low, int high) {
/* 默认取基准点的值为数组第一个值 */
int middleValue = array[low];
while (low < high) {
/*
* 从数组末尾判断其值是否大于等于基准点的值
* 1.若是high--继续左移判断
* 2.否则,交换low和high位置的值
*/
while (low < high && array[high] >= middleValue) {
high--;
}
swap(array, low, high);
/*
* 同理判断基准点左边从low下标开始的值是否小于等于基准点的值
* 1.若是low++继续右移判断
* 2.否则,交换low和high位置的值
*/
while (low < high && array[low] <= middleValue) {
low++;
}
swap(array, low, high);
}
/*当low不小于high的时候,说明已经找到基准点位置,即为low,返回low*/
return low;
}
/* 交换 */
public static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
运行结果:
总结:
1.时间复杂度:
平均时间复杂度为O(NlogN)
最坏时间复杂度为O(N^2)
2.稳定性
因为判断的标准是array[high]>=middleValue,array[low]<=middleValue,并不是严格的大于小于,所以快速排序是不稳定性排序