每日一题快速排序

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题快速排序相关的知识,希望对你有一定的参考价值。

题目

给定一组数据,需要对该组数据进行排序,需要保证排序的速度足够快

要求:空间复杂度要求O(N)

例如: arr = 10, 2, 8, 2, 3, 6, 6, 1

​ res = 1, 2, 2, 3, 6, 6, 8, 10

解析

只要其对数据进行排序,并且要求速度足够快,并且不要求稳定性,那么可以选择多种算法(也可以选择睡眠排序),那么这里就选择足够快的快速排序

快速排序: 时间复杂度 O(N*logN),空间复杂度O(logN)

代码实现

**快速排序思想:**先将整体数组大致排序,即将数组划分为 小于、等于、大于区域,然后对每个区域进行单独排序,对小于、大于区域继续划分,然后排序,重复上面的过程,直到最小的区域排好序,那么整体数组就有序

public static void sort(int[] arr) 
    if (arr == null || arr.length == 0) 
        return;
    
    process(arr, 0, arr.length - 1);


private static void process(int[] arr, int L, int R) 
    if (L >= R) 
        return;
    
    // 先划分数组,然后递归排序
    int[] pivot = partition(arr, L, R);
    process(arr, L, pivot[0] - 1);
    process(arr, pivot[1] + 1, R);


private static int[] partition(int[] arr, int L, int R) 
    int less = L - 1;
    int moreR = R;
    while (L < moreR) 
        if (arr[L] < arr[R]) 
            swap(arr, ++less, L++);
         else if (arr[L] > arr[R]) 
            swap(arr, L, --moreR);
         else 
            L++;
        
    
    swap(arr, moreR, R);
    return new int[]less + 1, moreR;


private static void swap(int[] arr, int i, int j) 
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;

以上是关于每日一题快速排序的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)

letcode每日一题-对链表进行插入排序

笔试强训之每日一题

冒泡排序与每日一题

每日一题11.6

每日一题希尔排序的实现