首页 > 代码库 > 躲不掉的“排序算法”
躲不掉的“排序算法”
排序算法,以前米老师讲VB的时候就讲过排序,随机显示10个数,并显示最大的数。利用冒泡、希尔等等排序算法都讲过,这次数据机构导论再次遇到,软考再次遇到,应该算是比较容易的一项吧。
学习完数据结构导论,又进一步了解到了排序算法。我们都知道,排序是数据处理的一种运算,因为数据处理花费的时间很多,人么为了提高计算机的运行效率而提出了各种各样的排序算法。
用米老师的话说就是“两两比较交换”。
比较两个关键字的大小,将记录从一个位置移动到另一个位置。
排序的稳定性:
判断稳定性,通过相同键值的两个记录在排序前后相对位置变化情况进行判断。
例如:已知一组数据:1、3、2、5、6、2
通过排序得到1、2、2、3、5、6 排序前带下划线的2在不带下划线的2后面,排完序仍然在它后面就是稳定的,否则就是不稳定的。
1、插入排序
直接插入排序:依次将每个记录插入到一个已排好序的有序表中,得到一个新的、记录仪数增加1的有序表。
个人理解:通过和与前面排好的有序表数据进行比较,然后放到合适的位置去,直至排完。直接插入排序是相对于记录数较少的一种排序。
2、交换排序(两两比较,如果两个键值的大小出现逆序,则交换。)
冒泡排序:将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则交换;然后继续比较第二个和第三个,第n-1个和第n个。
个人理解:后一个数与前一个数进行比较,看是否需要交换。
快速排序:n个记录中取一个记录的键值为标准,通过一趟排序将待排序的记录分为小于、等于、大于这个键值的独立部分,再继续进行快速排序。
第一趟排序比较难(对外于我来说),这个会了后面也就简单了。一趟排序的步骤:将两个指针i,j分别指向初始位置和最后的位置,然后反复操作一下两步:
(1)、j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。
(2)、i逐渐增大,并逐次比较I指向的元素和目标元素的大小,若p(i)>T则交换位置。
3、选择排序
直接选择排序:在i此选择操作中,通过n-i次的键值比较,从n-i+1中选出键值最小的记录,和第i(1<=i<=n-1)个记录交换。
个人理解:找出最小的那个数与前面的数进行交换,前面排好的就不能动了。
堆排序:
首先要知道堆排序是一种树形选择排序.将一个初始序列建成一个堆就是一个反复筛选的过程.
个人理解:自上而下进行调整,重建堆的过程。
4、归并排序
将两个或两个以上的有序表合并成一个新的有序表。
二路归并排序
是将两个有序表合并成一个有序表的排序方法。
个人理解:1、每相邻的两个记录合并,两两比较、排序
2、再两个合并再比较进行排序。
总结:一句话“两两比较交换!”
以上学习方法是非常不好的,虽然是理解了每一种排序,但是没有进行比较,没有编制知识网,每种排序都有可能有相似之处,也有差别之处,用的过程可能会混淆。
学习方法: 结合以前老师讲过的,把它当做旧知识来重温,简单化,其实就是旧知识。
遇到的问题:
因为自己没有去相互比较每种排序,而每种排序又有一些相似之处,所有会混淆。
插入排序VS冒泡排序:插入排序是从第二个键值开始,与前面的数进行比较,放到合适的位置;
冒泡排序是1和2的键值比较,2和3的键值比较。。。。。。n和n-1的键值比较,出现逆序则交换。
冒泡排序VS直接选择排序:
冒泡排序是一个又三角,直接选择排序是一个左三角。
冒泡排序整个排序过程至多进行n-1趟起泡,直接选择排序进行n-1次比较,每趟找出最小(最大)的那个键值与前面的进行交换。
这样自己容易混的就不会记混了。个人理解可能存在问题,望大家指出,谢谢。
躲不掉的“排序算法”