每日一题给定数组实现稳定性排序
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. 在排序数组中查找元素的第一个和最后一个位置