package com.eight.paixu;
/*
* 快速排序:递归算法,将较大的一组换到后面去,较小的一组在前面,前面和后面的分别再递归调用
* 属于交换类排序
* 不稳定的排序算法 :如35512第一轮时前面的5和后面的2换位置,后面的5和1换位置,位置顺序被破坏
* 平均时间复杂度O(n*log2n)
* 最坏时间复杂度O(n*n)
* 空间复杂度O(1)
* n较大 时适用
* 其原理如下:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,
* 将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,
* 然后再用同样的方法递归地排序划分的两部分,直到序列中的所有记录均有序为止
*
* 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。
* 找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。
* 直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
接着分别比较左右两边的序列,重复上述的循环。
*
*/
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
int i, j, temp, t;
if (low > high) {
return;
}
i = low;
j = high;
// temp就是基准位
temp = arr[low];
while (i < j) {
// 先看右边,依次往左递减
while (temp <= arr[j] && i < j) {
j--;
}
// 再看左边,依次往右递增
while (temp >= arr[i] && i < j) {
i++;
}
// 如果满足条件则交换
if (i < j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
// 最后将基准位与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
// 递归调用左半数组
quickSort(arr, low, j - 1);
// 递归调用右半数组
quickSort(arr, j + 1, high);
}
public static void main(String[] args) {
int[] arr = { 10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 8, 9, 19 };
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
八大排序之快速排序
最新推荐文章于 2024-01-02 20:50:03 发布
5488

被折叠的 条评论
为什么被折叠?



