怎样将不稳定排序变为稳定的排序

来源:互联网 发布:淘宝宝贝分类源代码 编辑:程序博客网 时间:2024/05/16 09:04
初次学到数据结构的排序部分,很多同学对于排序的稳定性搞不懂,不知道稳定性是什么意思。举个栗子,上高中,大家最关心的是自己的名次了,那么最让人尴尬的事情就是同样分数的人该怎样排名呢!比如说高三年级的一二三班各有一个考了总分250分的同学,一班的叫刘备,二班的叫关羽,三班的叫张飞,学校统计成绩的时候是按照刘关张所在班级的顺序将成绩依次录入全年级的成绩库中,然后按照总分分数进行排名。可是排出来的名次是关羽、刘备、张飞。就有同学发现了。这同样的分数,学校排出的名次是按照学生姓名的第一个字母的顺序将分数相同的同学进行排序的。学校给出的名次是关羽、刘备、张飞。这种情况的排名就是不稳定的排序,当你看到这名次觉得,学号看着很变扭,不是从小到大拍的。如果看着顺眼,那顺序还得是刘关张。那就得自己调整了,很麻烦。(这就如同一组数据中录入三个2,排序后凭什么第二个2就排在最前面呢!排序可是按照大于或者小于排序的。相同的2是不可以和2交换的。)因为学校录入成绩是按照刘关张顺序录入,按理说最终排名应该还是刘关张。而这种情况是稳定排序。(成绩相同,不满足交换的条件)

就有同学说了,同样分数,一个前一两名和后一两名有必要分的这么清吗?这个问题就牵扯到了排序算法的稳定性重要性问题了。我们再了解排序算法的稳定性的作用吧!高考报志愿,名次重要吧!一百个人靠同样分数很常见。假如清华只录取其中前3名。录入顺序肯定是按照地区的代号录入成绩。排序稳定了,大家就提前预知名次了。很简单就体现了稳定性的作用。

怎样判断是不是稳定的排序呢!这就需要你对八大排序的算法很了解。举出造成该算法不稳定的数据顺序。没有窍门。根本方法就是按照定义套,举反例。没有反例就是稳定排序。接下来是这篇文章重点。当面试官问道:如何将不稳定的算法变成稳定的算法呢!这个问题或许难倒所有初学者。并且很多重点大学学生未必都会。

方法就是换。怎么换,排序最基本的方式就是将下标为m和下标为n的两个数进行交换。那么无论怎样都会有从m到n的一段数据。

如图所示:

这是升序排序的一部分,3和2交换就会发生不稳定情况,我们从该数组的这两个及交换的元素之间进行便利,找到与之相等的元素,然后和兑换。如图: 从下标为4的元素开始寻找,找到5号下标元素为2,与被交换的元素2(下标为8的元素)相等,那么将这两个等值元素交换。然后继续遍历数组,当找到3时,发现与被交换的3(下标为4的元素)相等,这时将两个等值元素交换。直到遍历到下标为8时结束遍历。也就是说遍历的长度是下标4到下标8之间的元素。只要遇到与值相等的就交换,即使是3个4个3也要交换。
如下是函数实现:

void Stable (int *arr, int start, int end)//(数组名,交换元素开始下标,交换元素结束的下标){int tmp;for (int i= start+1; i<end-1; i++){if (arr[start] == arr[i])//从start+1开始遍历,找到与start下标元素相等的元素{tmp = arr[start];//交换元素arr[start] = arr[i];arr[i] = tmp;} if(arr[i] == arr[end])//找到与end下标元素相等的元素{tmp = arr[end];//交换arr[end] = arr[i];arr[i] = tmp;}}}




原创粉丝点击