【Java】排序算法之快速排序

原理简介
       快速排序原理即是,选择数组中的一个元素作为基准值 pivot(通常使用第一个就行),然后遍历其他元素,将小于 pivot 的元素放置在左边,将大于 pivot 的元素放置在右边。如是你可以得到两个子数组,再依次对子数组进行快速排序,最终完成排序。

时间复杂度
        快速排序比选择排序快得多,其时间复杂度为 O(n * lg n),是最快的排序算法之一。最糟糕的情况下,快速排序的时间复杂度为 O(n^2)。

代码实现
        Java 的快速排序示例如下:

public class Main {
 
    public static void main(String[] args) {
        int[] arr = new int[] { 45, 80, 55, 40, 42, 85 };
        quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
    
    public static void quickSort(int[] arr, int start, int end) {
        if (end <= start) {
            return;
        }
        int low = start;
        int high = end;
        int pivot = arr[low];
        while (low < high) {
            while (low < high && arr[high] >= pivot) {
                high--;
            }
            arr[low] = arr[high]; // 将小于 pivot 的数放在地位
            while (low < high && arr[low] <= pivot) {
                low++;
            }
            arr[high] = arr[low]; // 将大于 pivot 的数放在高位
        }
        arr[low] = pivot;
        quickSort(arr, start, low - 1); // 递归排序左半部分
        quickSort(arr, low + 1, end); // 递归排序右半部分
    }
 
}

运行结果

40 42 45 55 80 85 

分析

1、设置两个指针分别指向数列起始和结束位置,左指针代表小于基准元素的区域,反之右指针大于基准。

2、从右指针处开始元素遍历,如果遍历到大于基准元素的,继续向后遍历。如果小于基准元素的,将指针位置与基准交换。

第一次:从后往前 查找比45小的数 42比45小 他俩交换位置:42,80,55,40,45,85

第二次:从前往后 找比45大的数 80>45 交换位置:42,45,55,40,80,85

第三次:从后往前 找比45小的数 40<45 交换位置:42,40,55,45,80,85

第四次:从前往后 找比45大的数 55>45 交换位置:42,40,4555,80,85

至此,第一趟排序结束,然后分别递归数组左右部分,即可完成快排(当数据基本有序时,不宜用快排)。

发布了62 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Yanzudada/article/details/101513859