当前位置: > 财经>正文

哪些排序是不稳定的?稳定又意味着什么? 债券型基金稳不稳定的原因有哪些方面的问题

2023-09-02 20:20:57 互联网 未知 财经

哪些排序是不稳定的?稳定又意味着什么?

      最近有看到稳定排序和不稳定排序这一说,貌似还是挺常识的概念,排序可能大家在面试当中经常被问到,但是对于稳定性和不稳定性,又了解多少呢?下面通过这篇文章给大家全面讲解一下。

 对于排序稳定性的意义:

通俗地讲就是待排序的序列中有两元素相等,排序之后它们的先后顺序不变。例如:如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。

其次就是稳定性带来的好处:

我们平时自己在使用排序算法时用的测试数据就是简单的一些数值,本身没有任何关联信息,这在实际应用中一般没太多用处。实际应该中肯定是排序的数值关联到了其他信息,比如数据库中一个表的主键排序(主键是有关联到其他信息)另外比如对英语字母排序,英语字母的数值关联到了字母这个有意义的信息。可能大部分时候我们不用考虑算法的稳定性,两个元素相等位置是前是后不重要,但有些时候稳定性确实有用处。它体现了程序的健壮性。

场景:比如你网站上针对最热门的文章或啥音乐电影之类的进行排名,由于这里排名不会像我们成绩排名会有并列第几名之说,所以出现了元素相等时也会有先后之分。如果添加进新的元素之后又要重新排名了,之前并列名次的最好是依然保持先后顺序才比较好。

回到主题,现在分析一下常见的排序算法的稳定性。

(1).冒泡排序(稳定)与快速排序(不稳定)

为什么要把这两个放一块儿进行对比呢?因为他们都是属于交换排序。

冒泡排序是通过不停的遍历,以升序为例,如果相邻元素中左边的大于右边的则交换.碰到相等的时就不交换保持原位.所以冒泡排序是一种稳定排序算法。

代码案例:

public void bubbleSort(int[] list) { int temp = 0; // 用来交换的临时数 // 要遍历的次数 for (int i = 0; i < list.length - 1; i++) { // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上 for (int j = list.length - 1; j > i; j--) { // 比较相邻的元素,如果前面的数大于后面的数,则交换 if (list[j - 1] > list[j]) { temp = list[j - 1]; list[j - 1] = list[j]; list[j] = temp; } } System.out.format("第 %d 趟: ", i); printAll(list); }}

快速排序是不稳定的.举例8   5   6  6 .以8为基准,第一趟交换后最后一个6跑到第一位,8到最后.第二趟交换.这个6跑到5的位置.变成有序的了.两个6位置变了,所以是不稳定的,最常见的也就是sort函数了。

代码案例:

** * 快速排序 * 平均O(nlogn),最好O(nlogn),最坏O(n^2);空间复杂度O(nlogn);不稳定;较复杂 * @author: Jack_Wu * @date: 2023年6月21日 */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就是基准位

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。