排序的方法有多种,有稳定和不稳定之分。所谓的稳定性也就是,对于原来的数列中的数会不会被打乱顺序被排列,最后得到的数列中相同的数是否被打乱顺序。
例如数列4(1) 5 8 4(2) 1 4(3) 在用不稳定的排序算法排序后数列中的三个4在结果中有可能不在是1,2,3依次的排列了,相同的被打乱了顺序。在题目的实际应用时,如果同时还有一个域记录的是另外的一组数据,以这组数不稳定排序,这组数的不稳定可能会导致另外的一个域中的数被打乱,从而影响结果的正确性。
排序的算法主要的有几种,快速排序,堆排序,选择排序,冒泡排序,插入排序等等。
平常的程序中快速排序比较常用,在C的函数库中还可以直接调用,比较的方便。下面先说说快速排序吧。
首先快排是一种不稳定的O(nlog(n))排序算法,就拿这种算法可以将代码打成random()的形式,也可以想象它是不稳定的。它是将一个数列进行不断的二分,取出中间一个数,分别和左右两边比较,使得左边比这个数大(小),右边比这个数小(大)为止。这样得到的结果显然是不稳定的,相同的数字很可能会被调换了位置,从而产生影响。要想使得这个排序的不稳定变得相对的稳定,就是进行多关键字排序,这样以来,第一关键字基本是稳定的,可是如果第一关键字和第二关键字都相同的话,那么,得到的结果还是不稳定的。所以说是达到的相对的稳定。
下面说选择排序O(N2),对于选择排序,也就是两层循环,数列中的数循环一遍,再从这个数循环至数列的尾部,可以想出来,后面的相同的数也可能被排到前面来。同样是不稳定的。
而冒泡排序O(N2)就不一样了,它只是和数列中的与当前的这个数相邻的数进行比较,不会进行间接的比较,所以冒泡排序是稳定的。
对于直接插入排序,基本思想是在数组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。这样得到的结果不会被打乱,相对的次序不会改变,也是稳定的,并且在有些时候直接插入排序还是很强大的,效率可以和堆排序相当。
最后说说堆排序也是不稳定的。堆排序是一个建立树的过程在建好的树中,成为大(小)根堆,输出了最大(小)的一个还需要调整堆,在这个时候,相对的次序也就会被打乱。这个使用语言不好解释,下面有一个数列1 2(1) 3 2(2) 构建成为大根堆就是
/ 1
/2(1)
3
\2(2) 在输出了3之后,哪一个2会被调整上来不确定。所以堆排序是不稳定的。
我仅仅是对几种的基本的排序算法进行了浅浅的分析,这些也就是我对排序算法稳定性的理解。