每日一题给定数组实现稳定性排序

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),其实有多种排序算法可以选择,但是肯定是最快的时间复杂度越好,所以可以使用归并排序

归并排序: 时间复杂度 O(N * logN) 空间复杂度: O(N)

稳定性:原数据中相同的元素,在排序之后的前后顺序仍然不变
例如:3,2,2,1 排序后 1,2,2,3 虽然中间两个2是相同的,但是原本第一个2和第二个2的顺序在排序之后没有改变才算保证了稳定

  • 这里没有选择快速排序,是因为快排不能保证稳定性

代码实现

**归并排序的思想:**先划分数组,将数组对半划分,直到划分到最小的区域,然后对最小的区域进行排序,等到左右的区域都排好序,然后对最大的两个左右区域进行合并,合并完成就对整体排好序

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 mid = (R + L) / 2
    int mid = L + ((R - L) >> 1);
    process(arr, L, mid);
    process(arr, mid + 1, R);
    merge(arr, L, mid, R);


private static void merge(int[] arr, int L, int mid, int R) 
    int[] help = new int[R - L + 1];
    int p1 = L;
    int p2 = mid + 1;
    int index = 0;
    while(p1 <= mid && p2 <= R) 
        help[index++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
    
    while(p1 <= mid) 
        help[index++] = arr[p1++];
    
    while(p2 <= R) 
        help[index++] = arr[p2++];
    
    for (int i = 0; i < help.length; i++) 
        arr[L + i] = help[i];
    

以上是关于每日一题给定数组实现稳定性排序的主要内容,如果未能解决你的问题,请参考以下文章

leedcode每日一题:34. 在排序数组中查找元素的第一个和最后一个位置

《LeetCode之每日一题》:90.在排序数组中查找元素的第一个和最后一个位置

[每日一题]44用Python实现插入排序

力扣每日一题:按奇偶排序数组2

每日一题769. 最多能完成排序的块

每日一题670. 最大交换